5

为了简化我的问题:假设我有 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

在我的情况下,除了一些与“房间”表有多对一关系的情况外,它工作得很好。因此,我不想在结果集中保存与“房间”表相关的“人物”和“事物”的不同名称,而是只接收两行:

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

GROUP BYr.id 上的 A将只有select每个表中的一行。非常感谢任何帮助!

4

2 回答 2

7

这就是您要查找的内容:

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
于 2013-05-21T23:26:56.527 回答
1

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

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

祝你好运。

于 2013-05-21T23:20:32.050 回答