MySQL左连接多对一行
Posted
技术标签:
【中文标题】MySQL左连接多对一行【英文标题】:MySQL Left Join Many to One Row 【发布时间】:2013-05-16 20:49:35 【问题描述】:为了简化我的问题:假设我有 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
r.id 上的GROUP BY
只会在每个表中出现select
一行。非常感谢任何帮助!
【问题讨论】:
【参考方案1】:这就是你要找的东西:
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
【讨论】:
谢谢!由于实际查询非常复杂,因此可以进行一些修改。 我花了好几个小时来处理这个只是因为我忘记了分组。谢谢。【参考方案2】:是的,您需要 group by 子句,并且需要使用 GROUP_CONCAT 函数。您应该按 People.fk_rooms 和 Thing.fk_rooms 对结果进行分组。
也许您可以使用两个不同的查询:第一个将导致 Rooms 和 People 的连接,按 fk_rooms 分组,选择了三列,它们是 RoomsID、RoomName、People,而第二个将导致 Rooms 和 People 的连接Thing,按 fk_rooms 分组,选择了三列,它们是 RoomID、RoomName、Things。在您的查询中,您将这些选择命名为 t1 和 t2,并通过 RoomsID 连接 t1 和 t2,选择 t1.RoomName、t1.People、t2.Things。
祝你好运。
【讨论】:
以上是关于MySQL左连接多对一行的主要内容,如果未能解决你的问题,请参考以下文章