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_sports связывает users и 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

Я пробовал с JOIN и GROUP_CONCAT, но я получаю странные результаты.
Нужно ли выполнять вложенный запрос?
Любые идеи?

+9
08 июн. '12 в 21:22
источник поделиться
2 ответа

Это не особенно сложно.

  • Присоедините три таблицы, используя предложение JOIN.
  • Используйте Group_concat в интересующих вас областях.
  • Не забывайте, что предложение GROUP BY в полях, которые вы не объединяете, или происходят странные вещи


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

Обновить LEFT JOIN, когда пользователь не имеет записей в User_Sports в соответствии с комментариями

+24
08 июн. '12 в 21:37
источник

Я думаю, что это просто объединение и агрегация:

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
+3
08 июн. '12 в 21:36
источник

Посмотрите другие вопросы по меткам или Задайте вопрос