有级别的页面

时间:2009-06-24 17:58:12

标签: php

抱歉,如果你觉得这个问题很愚蠢,但我真的需要帮助。这是关于它的一些信息。

数据库结构


id | parent_id |级别|名称

1 | 0 | 1 |主页

2 | 1 | 2 |主页的孩子

3 | 1 | 2 |主页的另一个孩子

4 | 2 | 3 |页面ID 2的子子

5 | 3 | 3 |页面ID 3的子子项


问题


如何使SQL语句按级别对行进行分组并进行此输出。

期望的输出


主页

~~主页的孩子

~~~~页面ID为2的子子

~~主页的另一个孩子

~~~~页面ID为3的子子

我知道如何使用递归方法执行此操作,但我想知道是否可以使用一个SQL语句来完成此操作。

3 个答案:

答案 0 :(得分:1)

好吧,您可以通过parent_id对数据进行排序,以便正确排序:

$menu = mysql_query("SELECT * FROM menu ORDER BY parent_id, level, name");

然后,使用级别来确定缩进:

while ($row = mysql_fetch_object($menu)) {
  echo str_repeat('~~', $row->level).' '.$row->name.'<br />';
}

假设您希望它们位于嵌套列表或其他元素中(而不是通过前缀缩进,例如'~~'):

$level = 0;
echo '<ul>';
while ($row = mysql_fetch_object($menu)) {
  if ($row->level > $level) {
    echo '<ul>';
  } else if ($row->level < $level) {
    echo '</ul>';
  }
  echo '<li> '.$row->name.'</li>';
  $level = $row->level;
}
for ($i = $level; $i >= 0; $i--) {
  echo '</ul>';
}

答案 1 :(得分:1)

我经常就Storing Hierarchical Data in a Database这样的问题推荐这篇文章。

您的问题的答案是肯定的,您可以在一个查询中获得它。您的方法(递归)将在第一页讨论。查看第二页的替代解决方案,即修改预订树遍历(MPTT)设计。使用该设置,您可以运行单个查询并检索结构的给定节点的所有子项。它与你现在的非常相似,但不完全相同,需要一些工作才能实现。

对于读取繁重的应用程序,MPTT是一个很好的算法。在写入时需要更多的工作,因为你必须修改整个树结构,但是根据你在那里设置的内容,我认为它可能对你有用。

答案 2 :(得分:0)

可以使用单个查询来完成,它将完全按照您的描述返回结果。关于mysql网站的分层数据有很棒的教程。

您可以直接进入“嵌套集模型”,但我建议您阅读整个教程。

这是链接: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/