对平面列表进行排序,按父级分组

Sort flat list, group by parents

提问人:Pekka 提问时间:11/20/2009 最后编辑:Pekka 更新时间:11/20/2009 访问量:485

问:

我在mySQL表中有一个平面页面列表。

ID    | Tab index | Page Name | parent 

页面可以是另一个页面的子级,由“parent”属性指定。

整个列表使用 “Tab index” int 列进行排序。

任何人都可以想出一种方法来查询此列表,以便

  • 项目按 Tabindex 排序

  • 作为另一个项目的子项分组在父项后面,并按其选项卡索引排序(可选)?

我的mySQL知识没有那么深。

这是现有的数据结构,无法更改。

提前感谢您的任何意见。

SQL MySQL 树视图

评论

0赞 Aleksander Kmetec 11/20/2009
如果我正确地理解了这一点,您希望子项紧跟在父项之后列出?或者可以将它们列在父项之后的任何位置,作为分组时的日志?

答:

0赞 Aleksander Kmetec 11/20/2009 #1

如果你的页面只有 1 级深度,你可以这样做。为了在多级嵌套中实现相同的结果,您需要递归查询,而MySQL不支持递归查询。... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id

评论

0赞 Pekka 11/20/2009
这看起来很棒,我明天会尝试一下并发布反馈。谢谢。
1赞 scribble 11/20/2009 #2

假设列 id、pagename、tabindex parent_id

select *,
    coalesce(
        tabindex,
        (select p2.tabindex from page as p2 where p2.id = p.parent_id limit 1),
        0
    ) as ti
from page as p
order by coalesce(ti, p.tabindex)
;

将按“ti”顺序返回这些列,这是以下值的第一个非 null 值:

  1. tabindex
  2. 父级的 TabIndex
  3. 0

这样,您就可以将子 tabindexes 留空,并让它们从父级“继承”。此外,如果您希望将默认排序值推到底部,则可以将 0(合并中的第三个参数)替换为 (select max(tabindex) + 1 from page)。唯一需要注意的是,如果子 tabindex 大于以下父 tabindex,它将出现在列表的后面。