Hier ist eine Idee. Aber es basiert auf vielen Annahmen über die Art und Weise, wie Ihre Daten eingerichtet sind. Ständig zunehmende IDs im Baum, nur zwei Ebenen usw.
SELECT f.foo_id,f.foo_parent_id FROM foo f
foo f
--geben Sie mir die höchste X-Anzahl von parent_ids(Das ist gut, Sie passen einfach das LIMIT 10 an, um die Anzahl der anzuzeigenden übergeordneten Ebenen zu variieren)
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
(Dieser Teil ist ziemlich hacky, da Sie eine immer längere Kette davon legen müssen, um an zwei Kindern vorbeizukommen)
--es ist das erste Kind, oder...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
)
or
--es ist das zweite Kind, oder...
(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
--es ist das übergeordnete Element
f.foo_parent_id is null
order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id
Was wir hier also tun, ist im Grunde genommen, nach der parent_id-Spalte und dann den untergeordneten Spalten darunter mit einer leichten Drehung zu ordnen. Wenn die parentid-Spalte NULL ist, verwenden wir die tatsächliche ID. Das bedeutet, dass unsere Tabelle für Bestellzwecke so aussieht:
==============================================================================
| 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
----------------------------------------------------------------------
Dann multiplizieren wir diese Sortierspalte mit *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
----------------------------------------------------------------------
und zuletzt fügen wir unsere foo_id-Spalte hinzu
==============================================================================
| 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
----------------------------------------------------------------------
Jetzt ordnen wir die Tabelle nach dieser virtuellen Spalte und...
==============================================================================
| 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
----------------------------------------------------------------------
Los geht's!