首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL从同一组外部表中获取行对

MySQL从同一组外部表中获取行对
EN

Stack Overflow用户
提问于 2017-06-19 06:01:53
回答 1查看 69关注 0票数 2

我的问题是下一个问题。

我有三张桌子:人、车和司机:

人民:

代码语言:javascript
运行
复制
Id     Name
1   |   Tom
2   |   James
3   |   Charles
4   |   Eric
5   |   Thomas
6   |   Robert
7   |   Kim
8   |   Ellias

汽车:

代码语言:javascript
运行
复制
Id      Name
1   |   Ford
2   |   Nissan
3   |   Hyundai

驱动:

代码语言:javascript
运行
复制
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辆车同时驾驶)。

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

代码语言:javascript
运行
复制
Name       Name     
Tom     |  James     (Only Ford)
Tom     |  Ellias    (Only Ford)
James   |  Ellias    (Only Ford)
Charles |  Eric      (None BOTH)
Thomas  |  Robert    (Ford and Nissan BOTH)

还请注意,金已经驾驶福特,日产和现代。所以金姆不会和任何人在一起。汤姆·詹姆斯和埃利亚斯都是福特的司机,所以他们是一对。

我已经厌倦了笛卡尔积和关系划分,但我没有找到解决方案。如果有人能帮我,至少在小费方面,我会非常感激的。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 06:46:31

您可以使用以下查询:

代码语言:javascript
运行
复制
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;

给每人开一辆车的清单。

输出:

代码语言:javascript
运行
复制
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

将上面的查询作为派生表使用两次,您可以获得所需的结果:

代码语言:javascript
运行
复制
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;

输出:

代码语言:javascript
运行
复制
Name    Name    cars_driven
----------------------------
Tom     James    Ford
Charles Eric     None
Thomas  Robert   Ford,Nissan
Tom     Ellias   Ford
James   Ellias   Ford

Demo here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44623213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档