Php 限制来自for each循环的查询结果

Php 限制来自for each循环的查询结果,php,mysql,foreach,Php,Mysql,Foreach,我在MySQL数据库中有三个表,从中填充一个下拉选择框。出现这个问题是因为我想使用一行结果作为选项组标签。然而,我实现的是optgroup在每个选项中重复出现 这些表格包括类别、技能和技能类别。类别是类别及其id(类别id、类别名称)的列表;技能是技能及其id(技能id、技能名称)的列表,技能类别将技能分配给类别(技能id、类别id) 这是我用来检索和显示技能列表的代码,以一种按类别名称分组的形式显示,而不是一个不可视地拆分的长列表: echo "<select name=\"skills

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

这些表格包括类别、技能和技能类别。类别是类别及其id(类别id、类别名称)的列表;技能是技能及其id(技能id、技能名称)的列表,技能类别将技能分配给类别(技能id、类别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>"
    ;
}
echo”“;
回声“;
$sql=“选择*来自技能”。
“在技能上左外连接技能\u类别。技能\u id=技能\u类别。技能\u id”。
“技能\u类别上的左侧外部联接类别。类别\u id=类别。类别\u id”
;
foreach($myconnect->query($sql)作为$row){
回声“;
回声“”
.$row['skill_name']。
""
;
}
问题是如何开始循环,该循环将获取
$row['category\u name']
以及技能列表,但不将类别名称放在每个技能的顶部。我相信答案就在眼前,但我看不到。我不想为每组技能手动编写每个optgroup和循环
单独使用。

尝试将以前使用的类别名称存储在变量中,并比较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>";
echo”“;
回声“;
$sql=“选择*从技能左侧外部加入技能上的技能\u类别。技能\u id=技能\u类别。技能\u id
技能\类别上的左侧外部连接类别。类别\ id=类别。类别\ id按类别\名称排序”;
$previousCategoryName=“”;
foreach($myconnect->query($sql)作为$row){
如果($previousCategoryName!=$row['category\u name'])){
如果($previousCategoryName!=“”){
回声“;
}
回声“;
$previousCategoryName=$row['category_name'];
}
回显“$row['skill_name']”;
}
回声“;

注意:我在查询中添加了ORDER BY category_name

尝试将以前使用的类别名称存储在变量中,并比较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>";
echo”“;
回声“;
$sql=“选择*从技能左侧外部加入技能上的技能\u类别。技能\u id=技能\u类别。技能\u id
技能\类别上的左侧外部连接类别。类别\ id=类别。类别\ id按类别\名称排序”;
$previousCategoryName=“”;
foreach($myconnect->query($sql)作为$row){
如果($previousCategoryName!=$row['category\u name'])){
如果($previousCategoryName!=“”){
回声“;
}
回声“;
$previousCategoryName=$row['category_name'];
}
回显“$row['skill_name']”;
}
回声“;

注意:我在查询中添加了ORDER BY category_名称

在SQL语句中添加了一个
ORDER BY category.category_名称
。(还考虑向ORDER BY子句添加附加表达式,以使结果更具确定性,因此每次查询都以相同的顺序返回行)

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

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

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


将从
$row['category\u name']
返回的值保存到“previous category\u name”变量中,以便下次通过循环进行比较。

按类别排序。category\u name
添加到SQL语句中。(还考虑向ORDER BY子句添加附加表达式,以使结果更具确定性,因此每次查询都以相同的顺序返回行)

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

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

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


将从
$row['category\u name']
返回的值保存到“previous category\u name”变量中,以便下次通过循环进行比较。

不要忘记关闭前一个
以及最后一个
,因为它们的数据可能不正确。我不知道数据库的结构,所以我将按照他/她所拥有的方式编写代码。在仔细考虑数据库的结构之前,我将技能存储在技能表的不同列中,这就是导致空和空问题的原因,我用
if(!EMPTY($row['bar'))
解决了这些问题。然后,我突然想到使用一列(带ID)并删除不整洁的空行。@Brett,我很抱歉。我错误地感谢佩瓦拉为代码所做的贡献。谢谢你宝贵的帮助。第一次工作。我曾想过在循环之前将一些东西存储在变量中,但我一直不知道如何实现它。非常感谢。我可能会保持秩序,因为我曾与GROUP BY玩过,最后只玩了一组。无需担心数据库中的空格,因为这三个表是直接列表(和关联),可以在不修改脚本的情况下轻松添加技能和类别。@MarkLee无需担心Mark。很高兴我能帮上忙,别忘了关闭上一个
以及最后一个,因为它们的数据可能不正确。我不知道数据库的结构,所以我只想按照他/她所拥有的方式编写代码,然后再考虑我拥有的数据库的结构