通过mysql订购多列

时间:2014-07-09 17:18:36

标签: php mysql

这是组表:

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

如何更改代码以获得我最喜欢的结果?

3 个答案:

答案 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 parent_ID不会超过9,999,999,999
  • ID不会超过9,999,999,999
  • 级别不会超过99.
  • mysql将简单编号转换为字符串。

前两个做的是为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