【问题标题】:JOIN and GROUP_CONCAT with three tablesJOIN 和 GROUP_CONCAT 与三个表
【发布时间】: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 例程不起作用?这似乎正是您所需要的(请参阅此页面:stackoverflow.com/questions/276927/…),因此查看查询以确定它是如何出错的可能会有所帮助。

标签: mysql sql join group-concat


【解决方案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】:

这不是特别困难。

  1. 使用 JOIN 子句连接三个表。
  2. 在您感兴趣的字段上使用 Group_concat。
  3. 不要忘记未连接的字段上的 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
猜你喜欢
  • 2016-01-16
  • 2014-07-19
  • 2019-03-09
  • 2020-10-25
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多