2015-03-28 4 views
1

у меня есть три таблицы в MySQLMySQL получить группы с определенными правами

группы, groups_rights, права

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

группы

id | name 
---------- 
1 | Professionnel 
2 | Surgerysync 

права

id | name 
---------- 
11 | USERS-ACCESS 
12 | PANEL-ACCESS 
13 | MEMBER 

groups_rights

id | group_id | right_id 
-------------------- 
1 | 1  | 11 
2 | 2  | 11 
3 | 1  | 12 
4 | 1  | 13 
5 | 2  | 13 

Я хочу, чтобы запрос, чтобы получить группы, которые не имеют права PANEL-ACCESS.

SELECT `groups`.`name`, `groups`.`id` FROM (`groups`) JOIN `groups_rights` ON `groups_rights`.`group_id` = `groups`.`id` JOIN `rights` ON `rights`.`id` = `groups_rights`.`right_id` WHERE `rights`.`id` NOT IN (11); 

Я использую вышеуказанный запрос, но получаю обе группы в качестве результата.

Что такое правильный запрос, чтобы получить только группу, у которой нет PANEL-ACCESS.

+0

Предоставить схему на http://sqlfiddle.com/ –

+0

http://sqlfiddle.com/#!9/1f0ce/1 –

ответ

0

Во-первых, панель-ACCESS идентификатор 12, так что вы должны использовать NOT IN (12)

Во-вторых, вместо того, отсылая rights.id, которое было бы трудно много раз, использование rights.name.

Наконец, получите список групп, имеющих PANEL-ACCESS, и найдите группы, которых нет в этом списке. Вот запрос, который работает для групп, не имеющих PANEL-ACCESS.

SELECT `groups`.`name`, `groups`.`id` FROM (`groups`) 
where `groups`.`id` not in (
SELECT `groups`.`id` FROM (`groups`) 
JOIN `groups_rights` ON `groups_rights`.`group_id` = `groups`.`id` 
JOIN `rights` ON `rights`.`id` = `groups_rights`.`right_id` 
WHERE `rights`.`name` = 'PANEL-ACCESS'); 
Смежные вопросы