2012-11-14 69 views
10

我有这样一个表:MySQL的:ORDER BY家长和孩子

+------+---------+- 
| id | parent | 
+------+---------+ 
| 2043 | NULL | 
| 2044 | 2043 | 
| 2045 | 2043 | 
| 2049 | 2043 | 
| 2047 | NULL | 
| 2048 | 2047 | 
| 2043 | 2047 | 
+------+---------+ 

其中显示了一个简单,2级的 “亲子” -corelation。我怎样才能通过SELECT语句ORDER BY来获取上面列表中的顺序,这意味着:第一个父代,第一个父代的子代,第二个父代的子代,第二个父代的子代等等(如果我有这些,我可以添加ORDER BYs为孩子们......我希望)。可以添加一个排序字段吗?

回答

43

包括排序孩子由ID:

ORDER BY COALESCE(parent, id), parent IS NOT NULL, id 

SQL Fiddle example

说明:

  • COALESCE(parent, id):一是排序(有效地组合在一起)母公司的ID。
  • parent IS NOT NULL:把父行的组
  • id的顶部:最后排序的所有儿童(同一母公司,而parent不为null)
0

如果你的表使用0而不是null指示没有父项:

id | parent 
------------- 
1233 | 0 
1234 | 1233 
1235 | 0 
1236 | 1233 
1237 | 1235 

使用greatest代替​​3210并检查值不等于0

ORDER BY GREATEST(parent, id), parent != 0, id