显示组合在一起的mysql行

时间:2013-08-29 18:31:14

标签: php

我有一个名为menu的表格,列(sequence, page_seq, name, parent_id)

sequencepage_seq无关紧要

parent_id空白的行是顶部菜单项,然后parent_id不为空的行是子菜单项

所以,假设有一行名称为Top Itemparent_id为空白,序列为1,另一行名为Sub 1parent_id为1因此,当您将鼠标悬停在Top Item上时,您将Sub 1作为子菜单项。

我正在尝试在我的后端管理面板中以组的形式显示这些内容。因此,顶部菜单项目及其下方的子链接就像......

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>

但它显示的是顶级菜单项,每个子菜单项位于每个子菜单项下方。

我是如何实现这一目标的?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好吧,看来你使用同一张桌来存储父母和孩子 父母由parent_id定义为空白 子节点由parent_id定义,不是空白 我不知道孩子和父母是如何联系在一起的。

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

$sql2="SELECT * from menu where parent_id != '' AND name = $result['XX']"

其中$result['XX']是来自第一个循环的当前父级,并且是父级子级的任何链接,但是我不知道您使用什么来确定哪些父级链接到哪些子级 - 名称?

<强>建议/信息 你没有检查(也许你这样做,而不是简单的例子)。如果任何一个查询什么都没找到会怎或者,如果第一个循环找到父级,第二个循环找不到子级? 你需要检查一下,确保你有数据,结果等,否则你可能会得到空白的菜单项,或者更糟。

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

或者至少如果您仍然使用一个表,则通过使用确定它们的列来严格定义父项和子项。即type = parent,type = child。这将消除您根据没有角色确定某个角色的可能问题(即parent_id = empty)。

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