2012-11-14 9 views
10

Tôi có một bảng như:MySql: ORDER BY cha mẹ và con

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

trong đó cho thấy một đơn giản, 2 cấp "cha-con" -corelation. Làm thế nào tôi có thể ORDER BY một SELECT-tuyên bố để có được thứ tự như trong danh sách trên, có nghĩa là: cha mẹ thứ nhất, con của cha mẹ thứ nhất, cha mẹ thứ 2, con của cha mẹ thứ 2 và như vậy (nếu tôi có, tôi có thể thêm ORDER BYs cho trẻ em ... Tôi hy vọng). Có thể withoug thêm một loại trường?

Trả lời

43

Bao gồm trẻ em sắp xếp theo id:

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

SQL Fiddle example

Giải thích:

  • COALESCE(parent, id): Đầu tiên Sắp xếp theo (có hiệu quả nhóm với nhau) id của cha mẹ.
  • parent IS NOT NULL: Đặt hàng mẹ trên đầu trang của nhóm
  • id: Cuối cùng sắp xếp tất cả các trẻ em (cùng cha mẹ, và parent không phải là null)
0

Nếu bảng của bạn sử dụng 0 thay vì null để chỉ một mục không có cha mẹ:

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

Sử dụng greatest thay vì coalesce và kiểm tra giá trị không bằng 0:

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