2012-06-08 35 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