2017-06-19 169 views
2

我的問題是下一個問題。MySQL從同一組外部表中獲得行對

我有3個表:人,車和驅動:

人:

Id  Name 
1 | Tom 
2 | James 
3 | Charles 
4 | Eric 
5 | Thomas 
6 | Robert 
7 | Kim 
8 | Ellias 

汽車:

Id  Name 
1 | Ford 
2 | Nissan 
3 | Hyundai 

驅動:

PID CID (People ID & Car ID) 
1 | 1 
2 | 1 
5 | 1 
5 | 2 
6 | 1 
6 | 2 
7 | 1 
7 | 2 
7 | 3 
8 | 1 

我想要檢索駕車的人同一套汽車。 我的意思是:如果湯姆只駕駛福特和詹姆斯駕駛也只是福特,我想把這對湯姆/詹姆斯作爲結果返回。此外,我想包括沒有駕駛任何車的人(即查爾斯/埃裏克(0輛車都驅動))。

與示例中的查詢結果上面應該返回兩列每個結果,例如:

Name  Name  
Tom  | James  (Only Ford) 
Tom  | Ellias (Only Ford) 
James | Ellias (Only Ford) 
Charles | Eric  (None BOTH) 
Thomas | Robert (Ford and Nissan BOTH) 

還要注意,金帶動福特,日產和現代。所以Kim不會與任何人配對。湯姆詹姆斯和埃利亞斯都是福特駕駛,所以他們與自己配對。

我試過笛卡爾產品和關係部門,但我沒有找到解決方案。如果有人能夠幫助我至少有一個提示,我會很感激。謝謝!

+1

您可以在樣本數據和正確的預期結果中添加Charles和Eric。另外根據'Drived'表中的第三條記錄,'Tom'開車'日產'以及爲什麼你提到*湯姆驅車只福特* –

+0

固定並添加整個示例 – ricaso

+0

試試這個SELECT GROUP_CONCAT(p.name)作爲人,c.name從驅動爲d加入人作爲p上p.id = d.PID加入汽車作爲c上c.id = d.CID組d.CID – Shibon

回答

1

您可以使用下面的查詢:

SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
FROM People AS p 
LEFT JOIN Driven AS d ON p.Id = d.PID 
LEFT JOIN Cars AS c ON c.Id = d.CID 
GROUP BY p.Id, p.Name; 

獲得汽車每人驅動的列表。

輸出:

Id Name cars_driven 
----------------------- 
1 Tom  Ford 
2 James Ford 
3 Charles None 
4 Eric None 
5 Thomas Ford,Nissan 
6 Robert Ford,Nissan 
7 Kim  Ford,Hyundai,Nissan 
8 Ellias Ford 

使用上面的查詢兩次作爲派生表就可以得到所要的結果:

SELECT t1.Name, t2.Name, t1.cars_driven 
FROM ( 
    SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
    FROM People AS p 
    LEFT JOIN Driven AS d ON p.Id = d.PID 
    LEFT JOIN Cars AS c ON c.Id = d.CID 
    GROUP BY p.Id, p.Name) AS t1 
JOIN ( 
    SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
    FROM People AS p 
    LEFT JOIN Driven AS d ON p.Id = d.PID 
    LEFT JOIN Cars AS c ON c.Id = d.CID 
    GROUP BY p.Id, p.Name 
) AS t2 ON t1.Id < t2.Id AND t1.cars_driven = t2.cars_driven; 

輸出:

Name Name cars_driven 
---------------------------- 
Tom  James Ford 
Charles Eric  None 
Thomas Robert Ford,Nissan 
Tom  Ellias Ford 
James Ellias Ford 

Demo here

+0

正是我需要的。你非常感謝你! – ricaso