0

我有 2 张桌子:

id,cat_name

  1. 子猫

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>';
        }
    ?>
4

1 回答 1

0

由于他们的维护问题,我讨厌这样做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'];

如果它与前一个条目相同,这会将项目添加到列表中,否则它将启动一个新列表。事情是处理 NULL的!empty快速尝试,例如在没有带回匹配SubCat项但您在Cat. 如果永远不会发生这种情况,您可以消除该if语句并将您的查询转换为:

"SELECT * FROM Cat INNER JOIN SubCat ON SubCat.under_cat = Cat.cat_id;"

你问为什么要付出所有这些努力?因为这将提供您想要的结果集,而只查询一次。您之前构建它的方式会查询无数次,这会杀死服务器并大大降低性能。

希望这对您的问题和您的整体实施知识都有帮助。

于 2013-10-29T22:12:38.903 回答