限制每个循环的查询结果

时间:2016-05-24 22:01:02

标签: php mysql foreach

我在MySQL数据库中有三个表,我从中填充一个下拉选择框。出现问题是因为我想使用结果行作为选项组标签。然而,我所取得的成果是每个选项都会重复使用optgroup。

表格是category,skill和skill_category。类别是类别及其ID的列表(category_id,category_name);技能是一系列技能及其ID(skill_id,skill_name)和skill_category将技能分配给类别(skill_id,category_id)。

这是我用来检索和显示表单中的技能列表的代码,这些表单按类别名称分组,而不是一个没有视觉分解的长列表:

echo "<select name=\"skills\">";
echo "<option size =30 ></option>";
$sql = "SELECT * FROM skill " . 
       "LEFT OUTER JOIN skill_category ON skill.skill_id=skill_category.skill_id " .
       "LEFT OUTER JOIN category ON skill_category.category_id=category.category_id"
;
foreach ($myconnect->query($sql) as $row){
    echo " <optgroup  label='" . $row['category_name'] ."'>";
    echo "<option value='" . $row['skill_name'] ."'>" 
            . $row['skill_name'] .
         "</option>"
    ;
}

问题是如何开始获取$row['category_name']以及技能列表但没有每个技能顶部的类别名称的循环。我相信答案是盯着我,但我无法看到它。我不想为每组技能手动编写每个optgroup和循环 分开。

2 个答案:

答案 0 :(得分:0)

尝试将先前使用的类别名称存储在变量中,并比较for循环的每次迭代。如果值不同,则表示它是之前未使用过的类别。

echo "<select name=\"skills\">";
echo "<option size=\"30\"></option>";
$sql = "SELECT * FROM skill LEFT OUTER JOIN skill_category ON skill.skill_id=skill_category.skill_id
LEFT OUTER JOIN category ON skill_category.category_id=category.category_id ORDER BY category_name";
$previousCategoryName = "";
foreach ($myconnect->query($sql) as $row) {
  if ($previousCategoryName != $row['category_name']) {
    if ($previousCategoryName != "") {
      echo "</optgroup>";
    }
    echo "<optgroup  label='" . $row['category_name'] ."'>";
    $previousCategoryName = $row['category_name'];
  }
  echo "<option value='" . $row['skill_name'] ."'>" . $row['skill_name'] ."</option>";
}
echo "</optgroup>";

注意我将ORDER BY category_name添加到查询

答案 1 :(得分:0)

向SQL语句添加ORDER BY category.category_name。 (还要考虑在ORDER BY子句中添加其他表达式以使结果更具确定性,因此每次查询运行时都会以相同的顺序返回行。)

在循环之前,初始化变量以保存“previous category_name”。

在循环内部,将$row['category_name']的返回值与“previous category_name”变量的内容进行比较。

使用条件测试。如果值不同,则输出新的类别名称。否则,跳过输出category_name。

$row['category_name']返回的值保存到“previous category_name”变量中,以便下次循环时可以进行比较。