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语句来完成此操作。
答案 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/