2016-04-21 3 views
1

Ich habe eine Tabelle wie dieseMySql: Auftragsdatensatz von id und Eltern

CREATE TABLE `Table1` (
`id` INT NOT NULL AUTO_INCREMENT, 
`parent` INT NOT NULL, 
`comment` TEXT, 
PRIMARY KEY(`id`) 
); 

Welche Beispieldaten hat folgende (mit einigen Benutzern erzeugten Text in Kommentarfeld)

+------+---------+- 
| id | parent | 
+------+---------+ 
| 1 | 0 | 
| 2 | 1 | 
| 3 | 0 | 
| 4 | 1 | 
| 5 | 0 | 
| 6 | 5 | 
| 7 | 4 | 
+------+---------+ 

Wie kann ich Reihenfolge in SELECT-Anweisung.

+------+---------+- 
| id | parent | 
+------+---------+ 
| 1 | 0 | 
| 2 | 1 | 
| 4 | 1 | 
| 7 | 4 | 
| 3 | 0 | 
| 5 | 0 | 
| 6 | 5 | 
+------+---------+ 

Ich möchte einen Rekord nach dem übergeordneten Datensatz zur Liste, und Zeilen mit Mutter 0 sollten auf Grundlage ihrer ‚id‘ sortiert werden.

+0

Nicht klar konnte man ein bisschen mehr über die Sortierlogik erklären Sie ar E nach? –

+1

Sind Sie sicher, dass Sie keine Zeilen mit übergeordnetem 0 an oberster Stelle und dann nach ID sortiert haben möchten, wie der Rest Ihrer Zeilen? Ich kann nicht sehen, wie diese Anordnung nützlich sein könnte. Wenn Sie je nach Wert eine andere Sortierregel anwenden, dann ist es nicht wirklich sortiert. –

+1

MySQL ist nicht dazu gedacht, diese Art von Dingen zu tun, besser, nachdem Sie die Daten durch Schleifen durch das Array extrahiert haben. – Jester

Antwort

1

Also, wenn ich richtig verstehe, sind Ihre Kommentare wie ein Baum (Wurzel ist 0, andere haben alle ein Elternteil und sind letztlich mit 0 verknüpft). Ich weiß nicht, welche SQL-Technologie Sie verwenden, aber Oracle bietet eine Möglichkeit, die Baumelemente in der Reihenfolge anzuzeigen.

Geben Sie für „beginnen mit“ und „Verbindung durch“, zum Beispiel hier: http://www.adp-gmbh.ch/ora/sql/connect_by.html

ich denke, das Sie erreichen könnte helfen, was Sie

etwas tun wollen, wie (nicht getestet, nur ein Hinweis)

select * from Table1 start with 0 connect by parent 

EDIT

Sin ce Sie verwenden tatsächlich MySQL, die obige Lösung ist nicht möglich (Danke @MJV für die Kenntnisnahme). Hier ist eine Idee einer Lösung. Es wird davon ausgegangen, dass Sie beim Einfügen eines neuen Kommentars weitere Informationen in Ihre Tabelle einfügen können. Es wird auch angenommen, dass ein neuer Kommentar eine höhere ID als seine Eltern (für die einfache Sortierung) haben wird.

Sie könnten das root_parent (höchste Eltern) für jeden Kommentar in Ihrer Tabelle hinzufügen:

+------+---------+-------------+ 
| id | parent | root_parent |    Corresponding trees 
+------+---------+-------------+ 
| 1 | 0 |  1  |   1   3   5 
| 2 | 1 |  1  |  /\    /
| 3 | 0 |  3  |  / \    / 
| 4 | 1 |  1  |  2  4    6 
| 5 | 0 |  5  |   /
| 6 | 5 |  5  |  /
| 7 | 4 |  1  |   7 
+------+---------+ ------------+ 

Jetzt können Sie Ihre Bestellung erhalten, indem

Aufruf
select * from table1 order by root_parent, id 

Lassen Sie mich wissen, ob es

gearbeitet
+0

Und Sie können hier nach äquivalent suchen, wenn Sie nicht Oracle verwenden: http://stackoverflow.com/questions/2200636/oracle-connect-by-clause-equivalent-in-sql-server –

+0

Ich denke MySQL (worum es in der Frage ging, unterstützt keine rekursiven Abfragen. Mehr hier: http://stackoverflow.com/questions/7631048/connect-by-prior-äquivalent-for-mysql – MJV

Verwandte Themen