2012-06-08 37 views
9

我有三个表:JOIN和GROUP_CONCAT三个用表

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_sportsusers链接和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 

我试图与JOINGROUP_CONCAT但我得到奇怪的结果。
我需要做一个嵌套查询吗?
任何想法?

+2

你可以发布你的group_concat例程不起作用吗?这似乎正是你所需要的(见本页:http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field),所以它可能会有所帮助查看查询,确定它出错的方式。 – user158017

回答

24

它不是特别困难。

  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

更新当用户没有进入时,左加入在User_Sports根据评论

+0

令人惊叹! +1为sqlfiddle – Peter

+1

为什么内部连接代替左连接?和一个'group by'似乎已经足够了:http://sqlfiddle.com/#!2/4d402/9 – Peter

+0

内部连接通常比左侧连接执行得更好,所以我从那里开始。您是否对sports_users中不存在的用户感兴趣? –

3

我认为这只是一个简单的连接和聚合:

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