MySQL左连接多对一行

时间:2013-05-21 23:08:17

标签: mysql select group-by left-join

为了简化我的问题:假设我有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每个表中的一行。任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:4)

这就是你要找的东西:

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

答案 1 :(得分:1)

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

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

祝你好运。