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 链接userssports,并按优先顺序(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

我尝试过使用JOINGROUP_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

sqlite3 JOIN,GROUP_CONCAT 使用不同的自定义分隔符

GROUP_CONCAT 与 LEFT JOIN 条件?