[MYSQL 5.1] Zeilen mit Vorgänger/Nachfolger sortieren

Artorius

Mitglied Plutonium
Hallo,
ich sitze hier gerade vor einem Problem, bei dem ich noch nicht mal einen Ansatz habe...
Folgende Tabellenstruktur ist vorhanden:
Code:
ID     |NEXT_ID|PREV_ID|
2      |6      |1
4      |1      |5
6      |NULL   |2        
1      |2      |4
3      |5      |NULL
5      |4      |3
Ich habe hier also eine doppelt verkettete Liste, ie ich gerne sortiert ausgeben würde, d.h. so sollte es aussehen:
Code:
ID     |NEXT_ID|PREV_ID|
3      |5      |NULL
5      |4      |3
4      |1      |5        
1      |2      |3
2      |6      |1
6      |NULL   |2

Jemand eine Idee, wie ich das anzupacken hätte?

Grüße!
 
Zuletzt bearbeitet:
Sorry, hier stand vorher etwas falsches.

Nach was möchtest du jetzt sortieren? Ich finde drei Beispiel-Datensätze reichen nicht aus, dass zweifelsfrei zu erkennen. Zeig uns vielleicht mal 4 oder mehr Zeilen und wie du sie gerne hättest.
 
Zuletzt bearbeitet:
Okay, gebe zu, als Aussenstehnder ist das nicht sofort ersichtlich. Das Beispiel habe ich also erweitert und dann jetzt nochmal zu Erklärung:
Jeder Datensatz hat einen Vorgänger (PREVID) und einen Nachfolger(NEXTID).Der erste Datensatz hat logischerweise keinen Vorgänger, der letzte keinen Nachfolger, also NULL.

Den Datensatz, den ich an erster Stelle sehe möchte, wäre die ID 3, denn dieser hat keinen Vorgänger. ID 3 hat als NEXTID die 5, also wäre dieser Datensatz der zweite in meiner Liste. ID 5 verweist dann auf ID 4 etc. etc. bis wir dann den letzten Datensatz erhalten, den mit der ID 6. Also insgesamt hätte ich gerne eine sortierte verkettete Liste.

Hoffe es ist nun ein wenig klarer.

Grüße!
 
Zuletzt bearbeitet:
Es geht über MySQL. Ich habe mal zum Test deine Tabelle bei mir mit dem Namen 'sort' angelegt.
Besonders performant wird die Lösung aber nicht sein...

SQL:
SELECT
	sorted.rownum,
	sort.*	
FROM
	(SELECT 
		@rownum := @rownum + 1 AS rownum,
		@id :=(SELECT id FROM sort WHERE IFNULL(prev_id, -1) = IFNULL(@id, -1)) AS sortedid
	FROM
		sort,
		(SELECT @id := NULL, @rownum := 0) AS vars
	) AS sorted
	INNER JOIN sort
		ON sort.id = sorted.sortedid

Die eigentliche Sortierung findet im Subquery statt
SQL:
SELECT 
	@rownum := @rownum + 1 AS rownum,
	@id :=(SELECT id FROM sort WHERE IFNULL(prev_id, -1) = IFNULL(@id, -1)) AS sortedid
FROM
	sort,
	(SELECT @id := NULL, @rownum := 0) AS vars

Der SELECT über die Tabelle sort liedt keine Daten aus, sondern generiert einfach entsprechend viele Zeilen. Die Daten werden für jede Zeile mittels der gespeicherten id (@id) ausgelesen.
Die rownum ist einfach noch eine Zeilennummerierung zu den sortierten ids, mit der man später arbeiten kann.
 
Zuletzt bearbeitet von einem Moderator:
Hi!
Danke für das Beispiel, klappt tadelos bei mir!

Was Performance angeht, muss man mal schauen, wie sich das bei vielen Datensätzen auswirkt, auch im Vergleich, wenn die Server-Anwendung die Datensätze sortiern würde.

Aber wie gesagt, soweit erstmal vielen Dank!

Grüße!
 
Zurück