同时从两个 SQL 语句查询?

While query from two SQL statements?

提问人:jmiller 提问时间:12/6/2020 更新时间:12/7/2020 访问量:79

问:

我有两个SQL查询:第一个查询从数据库中提取所有查询,第二个查询查找任何:criteriacriteria 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();

然后,我正在编写一个循环来检查任何:whilecriteria 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." ";  
        }
    }
}

第二个未按预期运行。 我知道一定有一种更干净的方法可以做到这一点! 也许是一份声明?ifJOIN

php mysql mysqli while-loop

评论

0赞 jmiller 12/6/2020
@nbk 我正在尝试在“已完成”表中查找任何内容并将它们与表中的内容匹配。criteria_idcriteriaprepare_criteria
0赞 jmiller 12/6/2020
因为我正在使用查询来回显复选框并检查它们是否为 true。completed_cririteria_id

答:

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_criteriaprepare_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.. }我该怎么做?idcriteria_completed
0赞 jmiller 12/6/2020
查询中的意思是什么?pccLEFT 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