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