Объединить три таблицы в SQL - PullRequest
0 голосов
/ 23 марта 2011
User
uid name

Roles
uid role_id

Subscriptions
uid subscriptions_id

Хорошо, это может показаться слишком простым, но мы все не смогли получить желаемый результат, который должен выглядеть следующим образом:

user roles subscriptions
1    2,3   1,4,5
2    2,4   4,5,6
....

Вместо этого результат выглядит так:

user roles subscriptions
1    2,3   5
2    2,4   6
....

Команда выбора выглядит следующим образом:

SELECT User.name, 
       GROUP_CONCAT(Roles.role_id), 
       GROUP_CONCAT(Subscriptions.subscriptions_id) 
FROM   User 
       LEFT JOIN Roles ON User.uid = Roles.uid 
       LEFT JOIN Subscriptions ON Users.uid = Subscriptions.uid

кстати - GROUP_CONCAT не проблема. Если я пропущу это, я все равно получу что-то вроде этого:

user roles subscriptions
1    2     5
1    3     5
2    2     6

вместо

user roles subscriptions
1    2     1
1    3     4
1    -     5

Ответы [ 2 ]

0 голосов
/ 23 марта 2011
select
 u.uid, u.name, r.roles_grp_concat, s.subs_grp_concat
from
 users u
left outer join
(
   select uid, group_concat(role_id) as roles_grp_concat
   from roles group by uid
) r on r.uid = u.uid
left outer join
(
   select uid, group_concat(subscriptions_id) as subs_grp_concat
   from subscriptions group by uid
) s on s.uid = u.uid
order by
 u.uid;
0 голосов
/ 23 марта 2011

Я пробовал это:

SELECT User.uid, 
       GROUP_CONCAT(DISTINCT Roles.role_id), 
       GROUP_CONCAT(DISTINCT Subscriptions.subscriptions_id)
FROM   User 
       LEFT JOIN Roles ON User.uid = Roles.uid 
       LEFT JOIN Subscriptions ON User.uid = Subscriptions.uid
GROUP BY User.uid

и я получил это:

user    roles    subscriptions
1       2,3      1,5,4
2       2,4      4,5,6

Это ваш результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...