2017-06-19 35 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