[MYSQL] besondere Sortierung?

Bububoomt

ohne Vertrauen
ID: 10361
L
28 April 2006
19.666
769
Also ich glaube nicht das es mit mysql möglich ist.

Ich habe eine Tabelle die wie folgt aufgebaut ist:

ID Name Parent
1 xx 0
2 yy 0
3 zz 0
4 aa 1
5 bb 4
6 cc 2
7 dd 1


Ausgabe soll so erfolgen:
-1xx
--4aa
---5bb
--7dd
-2yy
--6cc
-3aa


geht das irgendwie auch mit mysl, oder wohl nur mit php?
Also maximal ebenen währen denke ich 6, aber schön, wenns halt für unbegrenzte menge an ebenen ginge.
 
Für unbegrenzte Stufen bräuchtest Du rekursives SQL. Soviel ich weiss, wird dies von mySQL nicht unterstützt.

Theoretisch könntest Du es bei einer bekannten Anzahl Stufen mit UNION ALL und INNER JOINs lösen ( dürfte allerdings extrem unflexibel und inperformant sein ). Das würde dann so aussehen ( mal für drei Stufen gemacht ):


SELECT A.ID as Sort1, 0 AS Sort2, 0 AS Sort3, zu selectiertende Spalten
FROM tabelle A WHERE A.parent= 0
UNION ALL
SELECT A.ID as Sort1, B.ID AS Sort2, 0 AS Sort3, B.zu selectierende Spalten
FROM tabelle A , tabelle B
WHERE B.parent = A.ID
AND A.parent = 0
UNION ALL
SELECT A.ID as Sort1, B.ID AS Sort2, C.ID AS Sort3, C.zu selectierende Spalten
FROM tabelle A , tabelle B, tabelle C
WHERE B.parent = A.ID
AND C.parent = B.ID
AND A.parent = 0

ORDER BY Sort1, Sort2,Sort3;

Bei 6 Stufen würde es entsprechend bis Sort6 gehen und du hättest 5 UNION ALLs.
 
Ok, dann doch lieber mit php, das denke doch dann sinnvoller. Da kann ichs lieber komplett auslesen und dann in ein array einsortieren.
 
Nein, kein rekursives MySQL das ist in ALLEN Dialekten falsch.
Genau für so etwas gibt es Nested Sets.
Diese sind zur Abbildung von Hierarchien in Datenbanken oder anderen Datenstrukturen zum effizienten auslesen, du kannst ganze Hierarchie-(Teil)Bäume mit einem Query auslesen
 
Nein, kein rekursives MySQL das ist in ALLEN Dialekten falsch.

Nur der Vollständikeit halber:
Dieses rekursive Statement würde funktionieren ( sofern der Dialekt rekursives SQL unterstützt ):


WITH ABCDE ( SORT , ID , PARENT , NAME ) AS

( SELECT CAST (ID AS VARCHAR(255)) AS SORT , ID , PARENT , NAME FROM tabelle
WHERE PARENT = 0
UNION ALL
SELECT SORT CONCAT '-' CONCAT CAST (A.ID AS VARCHAR(255)) AS SORT , A.ID , A.PARENT
, A.NAME
FROM tabelle A
INNER JOIN ABCDE B
ON A.PARENT = B.ID)

SELECT * FROM ABCDE ORDER BY SORT ;
 
Ja doof ausgedrückt :biggrin:
Es wäre in allen Datenbanken der falsche Ansatz, Nested Sets wurden genau dafür entwickelt und sind im lesen hoch effizient.
 
Also ich wollte das für ne art sitemap nutzen, im grunde auch nur für "Big G"...
Mal schauen wie ichs machen werde.