2012-06-08 32 views
9

Tôi có ba bảng:JOIN và GROUP_CONCAT với ba bảng

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 

Bảng user_sports liên kết userssports với một thứ tự ưu tiên (pref).

tôi cần phải thực hiện một truy vấn mà trả về này:

id | name | sport_ids | sport_names 
---+-------+-----------+---------------------------- 
1 | Peter | 1,2  | Tennis,Football 
2 | Alice | 3   | Basketball 
3 | Bob | 2,3,1  | Football,Basketball,Tennis 

Tôi đã thử với JOINGROUP_CONCAT nhưng tôi nhận được kết quả kỳ lạ.
Tôi có cần phải thực hiện truy vấn lồng nhau không?
Bất kỳ ý tưởng nào?

+2

bạn có thể đăng thói quen group_concat của mình không hoạt động không? Dường như chính xác những gì bạn cần (xem trang này: http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field), vì vậy nó có thể hữu ích cho bạn xem queryt o xác định nó đã đi sai như thế nào. – user158017

Trả lời

24

của nó không đặc biệt khó khăn.

  1. Tham gia ba bảng bằng mệnh đề JOIN.
  2. Sử dụng GROUP_CONCAT trên các lĩnh vực bạn quan tâm.
  3. Đừng quên mệnh đề GROUP BY trên các lĩnh vực bạn không concatenating hoặc 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

Cập nhật LEFT JOIN khi người dùng không có ent ries trong User_Sports theo nhận xét

+0

Tuyệt vời! 1 cho sqlfiddle – Peter

+1

Tại sao một bên trong tham gia thay vì một tham gia trái? và một nhóm 'duy nhất 'có vẻ là đủ: http://sqlfiddle.com/#!2/4d402/9 – Peter

+0

Tham gia bên trong thường hoạt động tốt hơn so với các kết nối trái nên tôi bắt đầu ở đó. Bạn có quan tâm đến Người dùng không tồn tại trong sports_users không? –

3

Tôi nghĩ rằng đây chỉ là một đơn giản tham gia và tập hợp:

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