MySQL 从同一组外部数据中获取成对的行 table

MySQL get pairs of rows from same set of foreign table

我的问题是下一个。

我有 3 个表:People、Cars 和 Driven:

人数:

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

我想检索驾驶同一组汽车的人对。 我的意思是:如果汤姆只开福特而詹姆斯也只开福特,我想 return 这对 Tom/James 作为结果。我还想包括一对没有开过任何车的人(即。Charles/Eric(0 辆车都开过))。

上面示例的查询结果应该 return 每个结果两列,例如:

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 驾驶过福特、日产和现代汽车。所以 Kim 不会与任何人配对。 Tom James 和 Ellias 都开 Ford,所以他们是一对。

我尝试了笛卡尔积和关系除法,但没有找到解决方案。如果有人能至少给我一点小费,我将不胜感激。谢谢!

您可以使用以下查询:

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

使用上面的查询两次作为派生table可以得到需要的结果:

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