|
|
|
| Здравствуйте!
Возможно вопрос банален (я начинающий), но мне нужно знать ответ на него.
Есть две таблицы:
users:
user_id
name
group_id
и groups:
group_id
name
Нужно вывести список принадлежности пользователей группам. Написал такой запрос:
SELECT users.name AS name, groups.name AS grName FROM users, groups WHERE
users.group_id=groups.group_id;
Тут все нормально (кажется).
ВОПРОС: как изменится эта выборка если пользователь может находиться в нескольких группах??? И как она изменится если пользователь не принадлежит ни одной из групп?
Спасибо!.. | |
|
|
|
|
|
|
|
для: likethat
(01.07.2007 в 15:38)
| | Пожалуйста................ очень нужна ваша помощь... | |
|
|
|
|
|
|
|
для: likethat
(01.07.2007 в 15:38)
| | Лучше написать так:
SELECT users.name AS userName,
groups.name AS grName
FROM users
LEFT JOIN groups ON users.group_id=groups.group_id;
|
Такой запрос (помимо того, что он значительно нагляднее показывает суть выполняемых действий) будет выводить даже тех пользователей, у которых не указана (или неправильно указана группа.
Первое - из-за синтаксиса конструкции соединения таблиц JOIN ... ON
Второе - благодаря применению внешнего левостороннего соединения LEFT JOIN
Если требуется, чтобы пользователь мог быть размещен в нескольких группах - этих таблиц не хватит.
В строку пользователя невозможно записать несколько групп.
Придется создать связующую таблицу для реализации отношения M:N - разные пользователи в разных группах: usr_grp_rel(id_rel, id_user, id_group)
Соответственно, и сам запрос потребуется переделать.
SELECT users.name AS userName,
groups.name AS grName
FROM users
LEFT JOIN usr_grp_rel ON users.user_id=usr_grp_rel.user_id
LEFT JOIN groups ON usr_grp_rel.group_id=groups.group_id
ORDER BY userName, grName
|
| |
|
|
|