2017-02-28 2 views
0

Es gibt eine "Kontakte" -Liste. Einige "Kontakte" sind Eltern und einige sind Kinder. Manche Kontakte haben mehr als ein Kind. Manche Kinder haben mehr als einen Elternteil. Ein Kontakt kann ein Elternteil und ein Kind (Enkelkinder) sein.MySql-Gruppe Von der gleichen Tabelle?

Die Beziehung zwischen Kontakten wird in der Tabelle "eltern_und_kinder" zugeordnet.

"contacts" table 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | p1 | 
| 2 | p2 | 
| 3 | p3 | 
| 4 | p4 | 
| 5 | p5 | 
| 6 | p6 | 
+----+------+ 

"parents_and_children" table 
+----+-----------+----------+ 
| id | parent_id | child_id | 
+----+-----------+----------+ 
| 1 |   1 |  2 | 
| 2 |   1 |  3 | 
| 3 |   3 |  4 | 
| 4 |   5 |  2 | 
| 5 |   5 |  3 | 
| 6 |   5 |  6 | 
+----+-----------+----------+ 

Das Ergebnis bei der Abfrage sein sollte:

+-------------------+------------------+ 
| parent(s) name(s) | children name(s) | 
+-------------------+------------------+ 
| p1, p5   | p2, p3   | 
| p3    | p4    | 
| p5    | p6    | 
+-------------------+------------------+ 

Beachten Sie, dass p3 ein Kind von p1 und p5 und auch Eltern zu p4 ist. p5 ist ein Elternteil für p2 und p3 mit p1 und p6 für sich.

Ich brauche keine komplette Lösung. Bitte zeig mir die Richtung, und ich komme selbst hin. Bisher hat nichts funktioniert.

+0

MySQL nicht native Unterstützung für Rekursion hat ... weshalb diese Frage weit – Strawberry

Antwort

0

können Sie GROUP_CONCAT zweimal wie folgt verwenden:

select pnames, 
    group_concat(distinct cname order by cname separator ',') cnames 
from (
    select group_concat(distinct c1.name order by c1.name separator ',') pnames, 
     c2.name cname 
    from parents_and_children p 
    join contacts c1 on p.parent_id = c1.id 
    join contacts c2 on p.child_id = c2.id 
    group by c2.name 
    ) t 
group by pnames 
+0

diskutiert ich glaube, es viele Kinder und Eltern sein kann, nicht nur 2. –

+0

@ GrzegorzGórkiewicz - Wo habe ich das vermutet? – GurV

+0

Ich war nicht genug vertraut mit "group_concat", um dies zu downvote;) Wäre gut, wenn Sie erklären könnten, was die obige Abfrage tut. –

Verwandte Themen