Đây là một ý tưởng. Nhưng nó dựa trên nhiều giả định về cách thiết lập dữ liệu của bạn. Luôn tăng ID xuống dưới dạng cây, chỉ có hai cấp, v.v.
SELECT f.foo_id,f.foo_parent_id FROM foo f
foo f
- cung cấp cho tôi X số lượng cấp độ cha mẹ cao nhất (Điều này tốt, bạn chỉ cần điều chỉnh LIMIT 10 để thay đổi số lượng cấp độ cha mẹ sẽ hiển thị)
INNER JOIN
(select foo_id from foo where foo_parent_id is null order by foo_parent_id
LIMIT 10
) top_foo_parent
on isnull(f.foo_parent_id,f.foo_id) = top_foo_parent.foo_id
WHERE
(Phần này hơi khó, vì bạn phải đặt một chuỗi dài hơn bao giờ hết để vượt qua hai đứa trẻ)
- đây là đứa con đầu lòng, hoặc ...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
)
or
- đó là con thứ hai, hoặc ...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id and fc1.foo_id not in (select MIN(foo_id) from foo fc2 where fc2.foo_parent_id=f.foo_parent_id))
)
or
- đó là cha mẹ
f.foo_parent_id is null
order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id
Vì vậy, những gì chúng tôi đang làm ở đây về cơ bản là sắp xếp thứ tự theo cột parent_id và sau đó là các cột con bên dưới nó với một chút thay đổi. Nếu cột gốc là NULL thì chúng tôi sử dụng ID thực. Điều này có nghĩa là đối với mục đích đặt hàng, bảng của chúng tôi trông giống như sau:
==============================================================================
| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)
==============================================================================
| 1 | NULL | (1)
| 2 | NULL | (2)
| 3 | 1 | 1
| 4 | 2 | 2
| 5 | 1 | 1
| 7 | 2 | 2
----------------------------------------------------------------------
Sau đó, chúng tôi nhân cột thứ tự đó * 100
==============================================================================
| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)*100
==============================================================================
| 1 | NULL | 100
| 2 | NULL | 200
| 3 | 1 | 100
| 4 | 2 | 200
| 5 | 1 | 100
| 7 | 2 | 200
----------------------------------------------------------------------
và cuối cùng, chúng tôi thêm cột foo_id của chúng tôi vào đó
==============================================================================
| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
==============================================================================
| 1 | NULL | 101
| 2 | NULL | 202
| 3 | 1 | 103
| 4 | 2 | 204
| 5 | 1 | 105
| 7 | 2 | 207
----------------------------------------------------------------------
Bây giờ chúng ta sắp xếp bảng theo cột ảo đó và ...
==============================================================================
| foo_id | foo_parent_id | ORDER BY isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
==============================================================================
| 1 | NULL | 101
| 3 | 1 | 103
| 5 | 1 | 105
| 2 | NULL | 202
| 4 | 2 | 204
| 7 | 2 | 207
----------------------------------------------------------------------
Chúng ta bắt đầu!