【问题标题】:While query from two SQL statements?同时从两个 SQL 语句查询?
【发布时间】:2021-03-17 21:58:36
【问题描述】:

我有两个 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 声明?

【问题讨论】:

  • @nbk 我正在尝试在“已完成”表中查找任何criteria_id,并将它们与prepare_criteria 表中的criteria 匹配。
  • 因为我使用查询来回显复选框并检查completed_cririteria_id 是否为真。

标签: php mysql mysqli while-loop


【解决方案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=?;

如果prepare_criteria 记录与prepare_criteria_complete 表中的记录不匹配,则查询使用coalesce 运算符返回“不完整”字符串。

【讨论】:

  • 你能解释一下coalesce是什么意思吗?
  • 我只是添加了一些解释。尝试运行查询并查看结果是否适合您的情况。
  • 看起来很有趣。我想将id 传递给复选框,如果criteria_completed 为真,则选中该框,例如: //if criteria_completed_id{ //do something... } else{ //do this.. } 我该怎么做这样做?
  • pccLEFT JOIN 查询中是什么意思?
  • 因为您没有提供表架构,所以我尝试猜测正确的查询。修复连接条件后立即查看。
【解决方案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
                                    }   
                                }
                            }

【讨论】:

  • 改编自上述@slavarozhnev 的解决方案。
  • 这段代码似乎没有做应该做的事情。我为你修复了格式
  • 它工作正常。我已将其回滚到我的版本 - 因为我在主体中使用 while 循环来回显 html 复选框(sql 在我的函数中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多