作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 张 table :
id,猫名
id、subcat_name、under_cat
我想制作一个列表,将子类别加载到正确的类别中问题出在第二个循环上,我无法让它工作我做错了什么?
<?
$query = "SELECT * FROM `Cat`";
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()){
echo '<li><a href="#">'
. $row['cat_name'] .
'</a><ul>';
$query2 = "SELECT * FROM `SubCat` WHERE under_cat = '". $row['cat_id'] ."'";
$result2 = $mysqli->query($query2);
while ($row2 = $result->fetch_assoc()){
echo '<li><a href="#">'
. $row2['subcat_name'] .
'</a></li>';
}
echo '</ul></li>';
}
?>
编辑:
同一类别的两个列表
这是代码:
<?
$query = "SELECT * FROM Cat LEFT OUTER JOIN SubCat ON SubCat.under_cat = Cat.cat_id;";
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()){
echo '<li><a href="#">'
. $row['cat_name'] .
'</a><ul>';
if($row['cat_id'] === $row['under_cat']){
echo '<li><a href="#">'.$row['subcat_name'].'</a></li>';
}
echo '</ul></li>';
}
?>
最佳答案
我讨厌做 SELECT *
因为它们的维护问题,但要使用你所做的,只需做一个 JOIN
:
"SELECT * FROM Cat LEFT OUTER JOIN SubCat ON SubCat.under_cat = Cat.cat_id;"
这将返回您想要的结果集,但您需要修改 PHP 来相应地创建列表,如下所示:
if($row['cat_id'] === $id){
echo '<li><a href="#">'.$row2['subcat_name'].'</a></li>';
} else {
echo '</ul></li><li><a href="#">'.$row['cat_name'].'</a><ul>';
iF(!empty($row['subcat_name'])){
echo '<li><a href="#">'.$row['subcat_name'].'</a></li>';
}
}
$id = $row['cat_id'];
如果项目与前一个条目相同,则将其添加到列表中,否则将启动一个新列表。 !empty
是处理 NULL 的快速尝试,例如没有从 SubCat
返回的匹配项,但在 Cat
中有条目。如果永远不会出现这种情况,您可以消除 if
语句并将查询转换为:
"SELECT * FROM Cat INNER JOIN SubCat ON SubCat.under_cat = Cat.cat_id;"
为什么要经历你问的所有这些努力?因为这将提供您想要的结果集,而只需查询一次。您之前构建的方式会查询无数次,这会杀死服务器并大大降低性能。
希望这对您的问题和整体实现知识都有帮助。
关于php - While 内部 While 来自不同的 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669991/
我是一名优秀的程序员,十分优秀!