2016-04-09 10 views
2

Ich versuche, alle Zeilen zu erhalten, die die Eltern-Kind-Beziehung erfüllt. zum BeispielErhalten Sie alle Daten der Eltern Kind Beziehung aus derselben Tabelle in Mysql

id   Title parent_id 
    1200  A  1000 
    1201  B  1000 
    1202  C  1000 
    1203  D  1000 
    1204  E  1200 
    1205  F  1200 
    1206  G  1201 
    1207  H  1205 
    1208  I  1205 
    1209  J  1205 

Jetzt habe ich 1209 id, möchte ich alle Zeilen abzurufen, die bis 1205 wie hier für 1209 Eltern-Kind-Beziehung Schiff erfüllen bezieht 1209 bis 1200 bezieht sich 1205 und 1200 bezieht sich auf 1000.

ich habe versucht, diese Abfrage

SELECT * FROM `category` a left join category b on a.id=b.parent_id where a.id=1209 

Aber das mir nur einen Datensatz gibt. Wir versuchen, alle Zeilen zu erhalten, die in dieser Beziehung vorkommen.

+0

MySQL hat wenig Unterstützung für hierarchische Beziehungen/rekursive Abfragen. Vielleicht finden Sie das interessant: http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database. –

+0

Danke. Interessantes Thema. Aber haben Sie nicht zu viel Zeit, um dies kurz zu lesen. Ich werde das später lesen. –

+0

Wählen Sie * aus der Kategorie als untergeordnete Kategorie als übergeordnetes Element bei parent.parent_id = child.id Diese Abfrage gibt mir alle Daten, aber wenn ich ID = 1209 darin übergebe, Dann gibt es mir wieder eine Zeile. –

Antwort

5

Wenn Sie nur nach Eltern, Großeltern, Urgroßeltern suchen, können Sie so etwas verwenden.

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
     CASE WHEN id = 1209 THEN @id := parent_id 
      WHEN id = @id THEN @id := parent_id 
      END as checkId 
    FROM Test 
    ORDER BY id DESC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle

Und für den Fall, wenn Sie alle Kinder und Enkelkinder oder große Enkelkinder eines ID finden wollten können Sie diese

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
      CASE WHEN id = 1200 THEN @idlist := CONCAT(id) 
       WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id) 
      END as checkId 
    FROM Test 
    ORDER BY id ASC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle for finding children

verwenden Abfrage für alle Eltern/Großeltern/Urgroßeltern mehrerer Kinder

SELECT id,title,parent_id FROM 
(SELECT id,title,parent_id, 
     CASE WHEN id in (1209,1206) THEN @idlist := CONCAT(IFNULL(@idlist,''),',',parent_id) 
      WHEN FIND_IN_SET(id,@idlist) THEN @idlist := CONCAT(@idlist,',',parent_id) 
      END as checkId 
FROM Test 
ORDER BY id DESC)T 
WHERE checkId IS NOT NULL 

sqlfiddle

+0

Großartig. Kann ich das für die n-te Ebene verwenden? –

+0

yeah probier es aus, solange die IDs deines Kindes immer größer sind als die ID der Eltern, es sollte funktionieren –

+0

Ja. Ich denke, das ist immer größer als die ID der Eltern. Es funktioniert. Vielen Dank. Ich habe 6 Stunden damit verbracht, bin aber gescheitert. –

Verwandte Themen