@dj_vadim

MySQL выборка многие ко многим (группы пользователи)?

Имею три таблицы:
users_list(user_id, name, uid, gender) -- пользователи
groups_list(group_id, uid, title) -- группы
users_groups (id, group, user_id) -- связка, пользователей с группами. Один пользователь может состоять в нескольких группах

Не могу построить запрос на выборку. Мне нужно выбрать всех пользователей из двух, трёх или более групп. Чтоб они не повторялись. Задаётся uid групп и по ним выбираются пользователи.

Пробовал так:
SELECT ul.user_id, ul.name, ul.uid, ul.gender
FROM users_list ul
INNER JOIN users_groups ON ul.user_id=users_groups.user_id
LEFT JOIN groups_list ON groups_list.group_id=users_groups.user_id
WHERE groups_list.uid=1233334555;

Но что-то котелок не варит)
  • Вопрос задан
  • 741 просмотр
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `ul`.`user_id`, `ul`.`name`, `ul`.`uid`, `ul`.`gender`
    FROM `users_list` AS `ul`
    JOIN `users_groups` AS `ug` ON `ul`.`user_id` = `ug`.`user_id`
    JOIN `groups_list` AS `gl` ON `gl`.`group_id` = `ug`.`user_id`
    WHERE `gl`.`uid` = :gid;

А вообще у вас база построена неправильно - в таблицах введены ненужные искусственные ключи при наличии натуральных. После нормализации останется:
user(uid, name, gender), unique(uid)
group(gid, title), unique(gid)
user_group(gid, uid), unique(gid, uid)
Ответ написан
@dj_vadim Автор вопроса
Решил задачу таким путём
SELECT `ul`.`user_id`, `ul`.`name`, `ul`.`uid`, `ul`.`gender`
FROM users_list ul
JOIN users_groups ug ON ug.user_id=ul.user_id
WHERE ug.group_id IN(SELECT gl.group_id FROM groups_list gl WHERE gl.uid=1233334555 OR gl.uid=2547899666);

Если кто-то что-либо добавит по этому поводу - буду рад.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@LiguidCool
А тут точно джоины нужны? Вроде можно через обычный where from?
Ответ написан
Комментировать
@wellgo
Я не понял зачем вам groups_list если уже связь по user_id?
SELECT t1.* 
FROM users_list 
WHERE EXISTS(
   SELECT t2.id 
   FROM users_groups t2 
   WHERE t2.user_id = t1.id AND FIND_IN_SET(t2.id, '1,2,3,4,и другие id групп через ,')
)


Ну или любой другой проверкой, это вариант "влоб по задаче"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы