Php 而在不同的MySQL表中

Php 而在不同的MySQL表中,php,mysql,Php,Mysql,我有两张桌子: 猫 id,cat_名称 子类别 id,子类别名称,在类别下 我想制作一个列表,将子类别加载到正确的类别中 问题是第二个循环,我不能让它工作 我做错了什么 <? $query = "SELECT * FROM `Cat`"; $result = $mysqli->query($query); while ($row = $result->fetch_assoc()){ echo '&l

我有两张桌子:

  • id,cat_名称

  • 子类别
  • id,子类别名称,在类别下

    我想制作一个列表,将子类别加载到正确的类别中 问题是第二个循环,我不能让它工作 我做错了什么

        <?
            $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>';
    

    我讨厌做
    选择*
    ,因为它们的维护问题,但要处理您所做的事情,只需做一个
    加入

    "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'];
    
    你问为什么要这么努力?因为这将提供您想要的结果集,而只查询一次。以前构建它的方式会查询数百万次,这会杀死服务器并大大降低性能


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

    它做错了什么?您是指
    $row2=$result2->fetch_assoc()
    ,有可能吗?它可以工作了,谢谢thomas!如果只使用一个表来显示猫和子猫,则可以使用多个深度,这样会更容易。要做到这一点,你可以使用一个parent_id可为空的字段。谢谢你,我的朋友,但这超出了我的水平,我无法以你的方式让它工作。我试图让它工作,但问题是,它为每个子类别加载一个新列表,即使它来自同一类别。。。请看编辑后的帖子:)
    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'];
    
    "SELECT * FROM Cat INNER JOIN SubCat ON SubCat.under_cat = Cat.cat_id;"