JOIN 和 GROUP_CONCAT 与三个表
Posted
技术标签:
【中文标题】JOIN 和 GROUP_CONCAT 与三个表【英文标题】:JOIN and GROUP_CONCAT with three tables 【发布时间】:2012-06-12 22:42:47 【问题描述】:我有三张桌子:
users: sports: user_sports:
id | name id | name id_user | id_sport | pref
---+-------- ---+------------ --------+----------+------
1 | Peter 1 | Tennis 1 | 1 | 0
2 | Alice 2 | Football 1 | 2 | 1
3 | Bob 3 | Basketball 2 | 3 | 0
3 | 1 | 2
3 | 3 | 1
3 | 2 | 0
表格user_sports
链接users
和sports
,并按优先顺序(pref
)。
我需要做一个返回这个的查询:
id | name | sport_ids | sport_names
---+-------+-----------+----------------------------
1 | Peter | 1,2 | Tennis,Football
2 | Alice | 3 | Basketball
3 | Bob | 2,3,1 | Football,Basketball,Tennis
我尝试过使用JOIN
和GROUP_CONCAT
,但结果很奇怪。
我需要进行嵌套查询吗?
有什么想法吗?
【问题讨论】:
您能否发布您的 group_concat 例程不起作用?这似乎正是您所需要的(请参阅此页面:***.com/questions/276927/…),因此查看查询以确定它是如何出错的可能会有所帮助。 【参考方案1】:我认为这只是一个简单的连接和聚合:
select u.id, u.name, group_concat(s.name order by pref separator ',')
from user_sports us join
users u
on us.id_user = u.id join
sports s
on us.id_sport = s.id
group by u.id, u.name
【讨论】:
完美运行【参考方案2】:这不是特别困难。
-
使用 JOIN 子句连接三个表。
在您感兴趣的字段上使用 Group_concat。
不要忘记未连接的字段上的 GROUP BY 子句或weird things will happen
SELECT u.id,
u.Name,
Group_concat(us.id_sport order by pref) sport_ids,
Group_concat(s.name order by pref) sport_names
FROM users u
LEFT JOIN User_Sports us
ON u.id = us.id_user
LEFT JOIN sports s
ON US.id_sport = s.id
GROUP BY u.id,
u.Name
DEMO
更新当用户根据 cmets 在 User_Sports 中没有条目时使用左连接
【讨论】:
太棒了! +1 为 sqlfiddle 为什么是内连接而不是左连接?一个group by
似乎就足够了:sqlfiddle.com/#!2/4d402/9
内连接通常比左连接执行得更好,所以我从那里开始。您对sports_users 中不存在的用户感兴趣吗?
是的,如果用户没有运动,我需要为他提供一个空/空白结果
好的,我已经更新了 LEFT JOIN 位的答案和 sqlfiddle。至于group by
,那是因为我已经习惯了。我真的没有更好的理由。在任何其他不合法的数据库中。这是docs on it以上是关于JOIN 和 GROUP_CONCAT 与三个表的主要内容,如果未能解决你的问题,请参考以下文章
JOIN 三个表 + GROUP_CONCAT 当有数据 + 第一个表的所有其余部分
MySQL UPDATE 与 GROUP_CONCAT 加入三个表
使用 GROUP_CONCAT 进行 LEFT JOIN 的奇怪结果
GROUP_CONCAT 与两个表的 LEFT OUTER JOIN