2017-02-28 86 views
0

有一個「聯繫人」列表。一些「聯繫人」是父母,一些是孩子。有些聯繫人不止一個孩子。有些孩子有更多的一個家長。 聯繫人可以是父母和孩子(大孩子)。MySql組由同一張表?

聯繫人之間的關係映射在表「parents_and_children」中。

"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 | 
+----+-----------+----------+ 

的查詢應該是結果:

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

注意,P3是P1和P5,也是一個家長到P4的孩子。 p5是p2和p3的父親,p1和p6是他自己的。

我不需要完整的解決方案。請告訴我方向,我會自己到達那裏。迄今爲止,沒有任何工作。

+0

MySQL沒有遞歸的原生支持...這就是爲什麼這個問題被廣泛討論 – Strawberry

回答

0

您可以使用GROUP_CONCAT兩次這樣的:

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

我想可能有很多孩子和家長,不只是2. –

+0

@GrzegorzGórkiewicz - 我在哪裏假設? – GurV

+0

我對'group_concat'不太熟悉,不願意用這種方法;)如果你能解釋上面的查詢是什麼,那會很好。 –