我的问题是下一个问题。
我有三张桌子:人、车和司机:
人民:
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)
还请注意,金已经驾驶福特,日产和现代。所以金姆不会和任何人在一起。汤姆·詹姆斯和埃利亚斯都是福特的司机,所以他们是一对。
我已经厌倦了笛卡尔积和关系划分,但我没有找到解决方案。如果有人能帮我,至少在小费方面,我会非常感激的。谢谢!
发布于 2017-06-19 06:46:31
您可以使用以下查询:
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
https://stackoverflow.com/questions/44623213
复制相似问题