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
我的问题是下一个。
我有 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