繁体   English   中英

MySQL左连接多对一

[英]MySQL Left Join Many to One Row

为了简化我的问题:假设我有3张桌子。

Rooms              People                    Things
--------           --------                  --------
id| name           id | name | fk_rooms      id | name | fk_rooms
-----------        ---------------------     ---------------------
1 | kitchen        1  | John | 1              1 | TV   | 2
2 | bedroom        2  | Mary | 2              2 | bed  | 2
                   3  | Andy | 1              3 | sink | 1
                   4  | Laura| 1

现在我正在做类似的事情:

SELECT r.name AS room_name, p.name AS name, t.name AS thing FROM Rooms r 
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id

在我的情况下,除了与“房间”表具有多对一关系的少数几个之外,它的工作原理非常完美。 因此,我希望只接收两行,而不是结果集中的新行与“ Rooms”表具有不同的“ People”和“ Things”名称。

1. kitchen, John, Andy, Laura, sink
2. bedroom, Mary, TV, bed

r.id上的GROUP BY将仅从每个表中select一行。 任何帮助深表感谢!

这是您要查找的内容:

SELECT r.name AS room_name, 
   GROUP_CONCAT(p.name separator ',') AS people_name, 
   GROUP_CONCAT(t.name separator ',') AS things
FROM Rooms r 
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id
GROUP BY r.id

是的,您需要group by子句,并且需要使用GROUP_CONCAT函数。 您应该按照People.fk_rooms和Thing.fk_rooms对结果进行分组。

也许您可以使用两个不同的查询:第一个查询将导致Room and People的连接,按fk_rooms分组,选择了三列,它们分别是RoomsID,RoomName,People,而第二个查询将导致Rooms和Thing的连接,分组由fk_rooms创建,选择了三列,分别是RoomID,RoomName,Things。 在查询中,将这些选择命名为t1和t2,并通过RoomsID将t1和t2连接起来,选择t1.RoomName,t1.People,t2.Things。

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM