提问人:jmiller 提问时间:12/6/2020 更新时间:12/7/2020 访问量:79
同时从两个 SQL 语句查询?
While query from two SQL statements?
问:
我有两个SQL查询:第一个查询从数据库中提取所有查询,第二个查询查找任何:criteria
criteria completed
SQL 查询 1
//get all criteria for section
$getcrit = $mysqli->prepare("SELECT id, category_id, section_name, criteria
FROM prepare_criteria
WHERE category_id=? AND section_name=? ");
$getcrit->bind_param('is', $cat_id, $sectname);
$getcrit->bind_result($criteria_id, $category_id, $section_name, $criteria);
$getcrit->execute();
$getcrit->store_result();
$row_cnt = $getcrit->num_rows();
$getcrit->fetch();
SQL 查询 2
//get any checked criteria from db
$getcompcrit = $mysqli->prepare("SELECT prepare_criteria_complete.criteria_id, prepare_criteria.id, prepare_criteria.criteria, prepare_criteria_complete.business_id, prepare_criteria_complete.category_id
FROM prepare_criteria_complete, prepare_criteria
WHERE business_id=?
AND prepare_criteria.id=prepare_criteria_complete.criteria_id");
$getcompcrit->bind_param('i', $business_id);
$getcompcrit->bind_result($cc_criteria_id, $criteria_completed_id, $comp_criteria, $business_id_db, $category_db);
$getcompcrit->execute();
$getcompcrit->store_result();
$gc_row_cnt = $getcompcrit->num_rows();
然后,我正在编写一个循环来检查任何:while
criteria completed
if ($gc_row_cnt >=1)
{
while ($getcompcrit->fetch() )
{
if ($cc_criteria_id==$criteria_completed_id)
{
echo $criteria_completed_id." ";
}
if ($criteria_id!=$criteria_completed_id)
{
echo $criteria_id." ";
}
}
}
第二个未按预期运行。
我知道一定有一种更干净的方法可以做到这一点!
也许是一份声明?if
JOIN
答:
2赞
Slava Rozhnev
12/6/2020
#1
当然,您可以使用下一个单个查询:
SELECT
pc.id, pc.criteria,
coalesce(pcc.business_id, 'not complete') business_id,
coalesce(pcc.category_id, 'not complete') category_id
FROM prepare_criteria pc
LEFT JOIN prepare_criteria_complete pcc
ON pc.id=pcc.criteria_id AND pcc.business_id=?;
查询使用 coalesce 运算符返回“未完成”字符串,以防记录与表中的记录不匹配。prepare_criteria
prepare_criteria_complete
评论
0赞
jmiller
12/6/2020
你能解释一下是什么意思吗?coalesce
1赞
Slava Rozhnev
12/6/2020
我只是补充了一些解释。尝试运行查询并查看结果是否适合您的情况。
0赞
jmiller
12/6/2020
看起来很有趣。我想传递 to 复选框,如果 为 true,则选中该框,例如: //if criteria_completed_id{ //做某事... } else{ //do this.. }我该怎么做?id
criteria_completed
0赞
jmiller
12/6/2020
查询中的意思是什么?pcc
LEFT JOIN
1赞
Slava Rozhnev
12/6/2020
因为你没有提供表架构,所以我试着猜测正确的查询。修复连接条件后立即查看。
-1赞
jmiller
12/7/2020
#2
SQL 查询
$qry = $mysqli->prepare("
SELECT
pc.id, pc.criteria, pc.category_id,
coalesce(pcc.business_id, 'N') business_id
FROM prepare_criteria pc
LEFT JOIN prepare_criteria_complete pcc
ON pc.id=pcc.criteria_id
WHERE pc.category_id=? ");
$qry->bind_param('i', $cat_id);
$qry->bind_result($qry_id, $qry_criteria, $qry_cat_id, $qry_bus_id );
$qry->execute();
$qry->store_result();
$qry_row_cnt = $qry->num_rows();
PHP的
if ($qry_row_cnt >=1)
{
while ($qry->fetch() )
{
if( ($qry_bus_id==$business_id) )
{
//criteria is checked
}
else
{
//criteria not checked
}
}
}
评论
0赞
jmiller
12/7/2020
改编自上面@slavarozhnev的解决方案。
0赞
Your Common Sense
12/7/2020
此代码似乎没有执行应执行的操作。不过,我为您修复了格式
0赞
jmiller
12/7/2020
它工作正常。我已经将其回滚到我的版本 - 因为我使用主体中的循环来回显 html 复选框(sql 在我的函数中)。while
评论
criteria_id
criteria
prepare_criteria
completed_cririteria_id