2016-10-16 39 views
0

我試圖創建層次結果集。在表格中記錄樣本記錄。 在下面的輸出中,我沒有第二列(根)的父母姓名,同樣,我有22位父母(根!沒有超級父母)。MYSQL沒有重複行 - 與多個父母的多對多的層次結構

Child Name Parent 
----------------- 
1  A 1-3 
2  B 1-3 
3  C 1-3 
1-3 D 1-10 
3-5 E 1-10 
6-10 F 1-10 
1-10 G 1-100 
201 w 200-210 
202 x 200-210 
203 y 200-210 
200-210 z 200-300 

我的代碼:在這裏我寫了3次Mysql連接查詢以獲得4個關卡。

SELECT 
t1.Child , 
t1.Name , 
t2.Child , 
t2.Name , 
t3.Child , 
t3.Name, 
t4.Child , 
t4.Name 
FROM 
code t1 
left join code t2 on t1.Child = t2.Parent 
left join code t3 on t2.Child = t3.Parent 
left join code t4 on t3.Child = t4.Parent 

輸出:

t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name 
------------------------------------------------------------------- 
1-100 root 1-10  G 1-3  D   1 A 
1-100 root 1-10  G 1-3  D   1 B 
1-100 root 1-10  G 1-3  D   1 C 
1-10  G  1-3  D  1  A 
1-10  G  1-3  D  1  B 
1-10  G  1-3  D  1  C 
1-3  D  1   A 
1-3  D  1   B 
1-3  D  1   C 
200-300 root 200-210 z  201  w 
200-300 root 200-210 z  202  x 
200-300 root 200-210 z  203  y 
200-210 z  201  w 
200-210 z  202  x 
200-210 z  203  y 

我只是想行1至3 & 10 - 12,

我正在尋找像

大PARENTS1(根行)給Grand Children's

Grand Parents2(Root)to Grand Children's

而不是線4 - 9 & 13 - 15,因爲信息是重複我山坳3,4,5,6有這個信息已經....等

我不想再行要複製

除外輸出:

t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name 
------------------------------------------------------------------- 
1-100 root 1-10  G 1-3  D   1 A 
1-100 root 1-10  G 1-3  D   1 B 
1-100 root 1-10  G 1-3  D   1 C 
200-300 root 200-210 z  201  w 
200-300 root 200-210 z  202  x 
200-300 root 200-210 z  203  y 

感謝

回答

0

你是在正確的軌道上。您可以在where子句中使用exists

SELECT t1.Child, t1.Name, t2.Child, t2.Name, 
     t3.Child, t3.Name, t4.Child, t4.Name 
FROM code t1 LEFT JOIN 
    code t2 on t1.Child = t2.Parent LEFT JOIN 
    code t3 on t2.Child = t3.Parent LEFT JOIN 
    code t4 on t3.Child = t4.Parent 
WHERE NOT EXISTS (SELECT 1 
        FROM code c 
        WHERE c.Child = t1.Parent 
       ); 

這將只返回一個根開始的行。

在你的情況,你也可以更簡單地做:

WHERE t1.Name = 'root' 

如果你喜歡。

+0

戈登,請解釋一下where子句不存在的部分。 非常感謝 – max

+1

@max請閱讀[文檔](http://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html) –

+0

@max。 。 。 where子句確保所選行僅用於沒有父對象的t1記錄。 –