Php 显示分组在一起的mysql行

Php 显示分组在一起的mysql行,php,Php,我有一个名为menu的表,其中有列(顺序、页码、名称、父id) sequence和page_seq是不相关的 父项id为空的行是顶部菜单项,而父项id为非空的行是子菜单项 因此,假设有一行名为Top Item且parent_id为空,顺序为1,另一行名为sub1且parent_id为1,因此当您将鼠标悬停在Top Item上时,您将sub1作为子菜单项 我正在尝试在我的后端管理面板上分组显示这些内容。因此,将有顶部的菜单项及其下面的子链接,如 Top Item 1 - Sub 1 - Sub 2

我有一个名为menu的表,其中有列
(顺序、页码、名称、父id)

sequence
page_seq
是不相关的

父项id为空的行是顶部菜单项,而父项id为非空的行是子菜单项

因此,假设有一行名为
Top Item
parent_id
为空,顺序为1,另一行名为
sub1
parent_id
为1,因此当您将鼠标悬停在
Top Item
上时,您将
sub1
作为子菜单项

我正在尝试在我的后端管理面板上分组显示这些内容。因此,将有顶部的菜单项及其下面的子链接,如

Top Item 1
- Sub 1
- Sub 2

Top Item 2
- Sub 3
- Sub 4
等等

以下是我目前掌握的PHP:

<table border="0" cellpadding="5" cellspacing="5">
    <tr>
        <td><strong>Name</strong></td>
    </tr>
    <?php
    $sql=" SELECT * FROM menu where parent_id = '' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
    while($result=mysql_fetch_array($rs))
    {
        echo '<tr>
        <td>'.$result["name"].'</td>
        </tr>';
        $sql2="SELECT * from menu where parent_id != '' ";
        $rs2=mysql_query($sql2,$conn) or die(mysql_error());
        while($result2=mysql_fetch_array($rs2))
        {
            echo '<tr>
            <td><dir>'.$result2["name"].'</dir></td>
            </tr>';
        }
}
?>
</table>

名称
但它显示的是顶部菜单项,每个子菜单项都位于每个子菜单项之下


有什么办法可以做到这一点吗?

请确保在$sql2期间选择所有子项,其中父项是您当前所在的顶部菜单项的序列(=id):

$sql2= 'SELECT * from menu where parent_id = "'.$result['sequence'].'"';

确保在$sql2期间您选择了所有子项,其中父项是您当前所在的顶部菜单项的序列(=id):

$sql2= 'SELECT * from menu where parent_id = "'.$result['sequence'].'"';

好的,似乎您使用同一个表来存储父项和子项。
父项由父项id为空定义。
子项由父项id不为空定义。
我不知道孩子和父母是如何联系在一起的

第一个查询设置一个循环并获取一个父循环。对于每个循环,您希望另一个循环显示该父循环的所有子循环。
您需要在第二个循环中定义第一个循环中当前正在播放的父循环,以了解要显示的子循环:

$sql2="SELECT * from menu where parent_id != '' AND name = $result['XX']"
其中,
$result['XX']
是第一个循环中的当前父对象,是将父对象链接到子对象的任何对象,但是我不知道如何确定哪些父对象链接到哪个子对象-name

建议/信息 你没有检查(也许你有,这里没有简单的例子)。如果两个查询都未找到任何内容,会发生什么情况?或者如果第一个循环找到父循环,而第二个循环没有找到子循环?
你需要检查东西,确保你有数据、结果等,否则你可能会得到空白的菜单项,或者更糟

看起来你可以用两张桌子来改善这一点,一张给所有父母,一张给所有孩子。在childs表中使用父表中的某些唯一引用作为父表和子表之间的链接。
因此,您可以为给定的父对象更新和选择一些子对象,或者为给定的子对象查找父对象,等等

或者,至少如果您仍然使用一个表,请通过一个列来确定父项和子项,从而严格定义父项和子项。ie类型=父,类型=子。这将消除基于某个对象没有角色(即parent_id=empty)而确定其角色时可能出现的问题


像往常一样,它没有必要更适合您的确切要求,这就是为什么它是一个建议/信息:)

好的,您似乎使用同一个表来存储父项和子项。
父项由父项id为空定义。
子项由父项id不为空定义。
我不知道孩子和父母是如何联系在一起的

第一个查询设置一个循环并获取一个父循环。对于每个循环,您希望另一个循环显示该父循环的所有子循环。
您需要在第二个循环中定义第一个循环中当前正在播放的父循环,以了解要显示的子循环:

$sql2="SELECT * from menu where parent_id != '' AND name = $result['XX']"
其中,
$result['XX']
是第一个循环中的当前父对象,是将父对象链接到子对象的任何对象,但是我不知道如何确定哪些父对象链接到哪个子对象-name

建议/信息 你没有检查(也许你有,这里没有简单的例子)。如果两个查询都未找到任何内容,会发生什么情况?或者如果第一个循环找到父循环,而第二个循环没有找到子循环?
你需要检查东西,确保你有数据、结果等,否则你可能会得到空白的菜单项,或者更糟

看起来你可以用两张桌子来改善这一点,一张给所有父母,一张给所有孩子。在childs表中使用父表中的某些唯一引用作为父表和子表之间的链接。
因此,您可以为给定的父对象更新和选择一些子对象,或者为给定的子对象查找父对象,等等

或者,至少如果您仍然使用一个表,请通过一个列来确定父项和子项,从而严格定义父项和子项。ie类型=父,类型=子。这将消除基于某个对象没有角色(即parent_id=empty)而确定其角色时可能出现的问题

和往常一样,它没有必要更适合您的确切需求,这就是为什么它是一个建议/信息:)