Помогите с выборкой

dron4ik

Новичок
Помогите с выборкой

есть три таблицы:
users
groups
users_groups

в users_groups соответсвенно связь
users_groups.user_id = users.id
users_groups.group_id = groups.id


мне нужно выбрать все группы в которых пользователь НЕ состоит

select * from `groups` left join `users_groups` ON users_groups.group_id=group.id where user_id!='11' group by groups.id

Если пользователь состоит в "этой" группе и ещё какой-нибудь пользователь состоит в этой-же группе, то группа отображается, хотя не должна.

Логику запроса понимаю, понимаю почему ТАК отображается, НО никак не могу "догнать" как от этого избавиться.
 

Anarki

Новичок
мне нужно выбрать все группы в которых пользователь НЕ состоит
А группы это какие группы? я вижу 2 таблицы со словом groups

Вот поэтому у меня вызывает сомнение вот это - [SQL]where user_id!='11'[/SQL]
Скорее отрицание пригодилось бы в условии JOIN'a
[SQL]
SELECT * FROM `groups` LEFT JOIN `users_groups` ON (users_groups.group_id=group.id AND users_groups.user_id!=11) GROUP BY groups.id
[/SQL]
 

dron4ik

Новичок
возможно и так, но, к сожалению, на результат это не влияет.
 

Breeze

goshogun
Команда форума
Партнер клуба
[sql]
select g.*, sum(if(u.user_id=11,1,0)) as summ from `groups` g left join `users_groups` u on u.group_id=g.id group by g.id having summ=0
[/sql]

попробуй так, хотя не уверен что будет оптимально по скорости
 

Bitterman

Новичок
[sql]
SELECT g.ID, ug.user_id
FROM groups as g
LEFT JOIN users_groups as ug ON ug.group_id=g.id AND ug.user_id=[USER_ID]
WHERE user_id IS NULL
[/sql]
так?
 

Breeze

goshogun
Команда форума
Партнер клуба
Bitterman
красота :) а меня что-то на group by заклинило
 

dron4ik

Новичок
Bitterman
ага, именно так и сделал:

select gu.user_id, g.id, g.name from group as g left join users_groups as gu on(g.id = gu.group_id and gu.user_id =$user_id where isnull(gu.user_id);

всем большое спасибо!
 
Сверху