我在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和循环
分开。
答案 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”变量中,以便下次循环时可以进行比较。