Inilah satu ide. Tetapi ini didasarkan pada banyak asumsi tentang cara pengaturan data Anda. Pernah meningkatkan ID di bawah pohon, hanya dua level, dll.
SELECT f.foo_id,f.foo_parent_id FROM foo f
foo f
--beri saya nomor X teratas parent_ids(Ini bagus, Anda cukup menyesuaikan LIMIT 10 untuk memvariasikan jumlah tingkat induk yang akan ditampilkan)
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
(Bagian ini agak rumit, karena Anda harus memasang string yang lebih panjang untuk melewati dua anak)
--itu anak pertama, atau...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
)
or
--Ini anak kedua, atau...
(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
--itu adalah orang tua
f.foo_parent_id is null
order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id
Jadi yang kita lakukan di sini pada dasarnya adalah mengurutkan berdasarkan kolom parent_id dan kemudian kolom anak di bawahnya dengan sedikit perubahan. Jika kolom parentid adalah NULL maka kami menggunakan ID yang sebenarnya. Ini berarti bahwa untuk tujuan pemesanan, tabel kita terlihat seperti ini:
==============================================================================
| 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
----------------------------------------------------------------------
Kemudian kita kalikan kolom pemesanan itu *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
----------------------------------------------------------------------
dan terakhir kita tambahkan kolom foo_id kita ke dalamnya
==============================================================================
| 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
----------------------------------------------------------------------
Sekarang kita memesan meja dengan kolom virtual itu dan...
==============================================================================
| 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
----------------------------------------------------------------------
Ini dia!