这是组表:
id parents_id level name
------------------------
1 null 0 a
2 1 1 a1
3 1 1 a2
4 null 0 b
5 null 0 c
6 1 2 a3
parent_id是id!
现在我想知道这个结果:获取并排序之后:
a
a1
a2
a3
b
c
我试过这个:
SELECT * FROM groups ORDER BY parent_id,level DESC
但结果是:
a
b
c
a1
a2
a3
如何更改代码以获得我最喜欢的结果?
答案 0 :(得分:1)
当你提到name
不相关时,返回,parent_id组首先是父节点,其余的是后面的节点。还假设所有ID都是正数。
select * from yourtable
order by coalesce(parents_id, id), coalesce(parents_id, -1), id
答案 1 :(得分:0)
开始复杂......
SELECT * FROM groups
ORDER BY concat(coalesce(lpad(parent_id,10,'0'),lpad(ID,10,'0')), lpad('level',2,'0'), name DESC
更简单
SELECT * FROM groups
ORDER BY coalesce(lpad(parent_id,10,'0'), lpad(ID,10,'0')), 'level', name DESC
结束了......
SELECT * FROM groups
ORDER BY coalesce(parent_id, ID), 'level', name DESC
这有一些假设:
前两个做的是为ID和父ID生成填充字符串 所以值看起来像
00000000100 a
00000000101 a1
00000000101 a2
00000000400 b
00000000500 c
00000000102 a3
正如您所看到的,当您按照数字对上述内容进行排序时,它应该按照所请求的顺序对有子项的父项进行排序。然而,为了让孩子们按正确的顺序排序,我们需要按级别排序,最后如果级别,父级和子级匹配,则按名称排序。但是,由于000000000101被列出两次,我需要命名来排序a1,a2。
以便按要求对值进行排序,然后按名称排序,因此重复项会应用一些排序。
然而,我意识到我们可以在没有填充的情况下完成同样的事情...级别可能需要在mysql的标记中,不确定它是否为保留字...
答案 2 :(得分:0)
select yt.*
from yourtable yt
left join yourtable parent on coalesce(yt.parents_id, yt.id) = parent.id
order by parent.name, -- this orders all the group together following parent''s name
case when yt.parent is null then 0 else 1 end, -- this put the parent first
yt.name -- finally this order by child name