Mysql Join, проверьте, есть ли у пользователя / нет разрешения - PullRequest
1 голос
/ 30 декабря 2011

Пытаюсь сделать это с помощью одного запроса, но хочу получить список всех пользователей, у которых есть разрешение на x. Это включает в себя таблицу пользователей и таблицу разрешений. Но, похоже, что любые соединения, которые я использую, не заботятся об операторе where (поскольку у пользователя обычно есть другое разрешение в таблице)

SELECT DISTINCT `u`.*
FROM (`system_users` AS u)
JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`permission` != 2
AND `p`.`permission` != 3  

У меня около 3900 пользователей, я должен получить около 2000 пользователей, которые не привязаны ни к идентификатору разрешения 2, ни к 3. Но все равно получают 3900. Проблема в том, что пользователь также может быть привязан к разрешению 1,5,6 .. . они все еще помещаются в список после того, как он группирует их.

Есть предложения?


Обновленный запрос, но все равно не повезло. Если я выдаю «разрешение» для каждого из них, я не получаю 2 или 3, перечисленные пользователи все еще могут иметь это разрешение там

SELECT DISTINCT `u`.*, `p`.`permission`
FROM (`system_users` AS u)
INNER JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`permission` NOT IN (2, 3)   

Это помогло:

SELECT * FROM system_users AS u 
        WHERE NOT EXISTS(
            SELECT 1 FROM system_user_permissions AS p
            WHERE u.id = p.user
            AND p.permission IN (2,3)
)

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011

Вы хотите not exists:

select
   *
from
   system_users u
where
   not exists (
       select 
           1 
       from 
           system_user_permissions p 
       where 
           p.id = u.user 
           and p.permission in (2,3)
   )

Все, что делает ваш первоначальный запрос, - отрицание любого пользователя, который имеет только разрешение 2 или 3, а не 1, 2 и 5 (что вам и нужно). not exists выкинет этого пользователя, как только для него будет найдено разрешение 2 или 3 в system_user_permissions.

1 голос
/ 30 декабря 2011

Вы можете использовать противоположный путь, указав, какие пользователи не должны появляться в списке, например:

SELECT DISTINCT `u`.*
FROM (`system_users` AS u)
JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`user` NOT IN
  (SELECT DISTINCT `user`
   FROM `system_user_permissions`
   WHERE `permission` = 2 OR `permission` = 3);
0 голосов
/ 30 декабря 2011

Вы пробовали это? Я думаю, что ваши проблемы ()

ВЫБЕРИТЕ DISTINCT u. * ОТ (system_users КАК U) ПРИСОЕДИНЯЙТЕСЬ system_user_permissions КАК ВКЛ u. id = p. user ГДЕ (p. permission! = 2 И p. permission! = 3)

0 голосов
/ 30 декабря 2011

Используйте ключевые слова NOT IN, чтобы выбрать группу значений, которые вы не хотите возвращать.Очевидно, что удаление «НЕ» имело бы обратный эффект.

SELECT DISTINCT `u`.* 
FROM (`system_users` AS u) 
INNER JOIN `system_user_permissions` AS p 
   ON `u`.`id` = `p`.`user` 
WHERE `p`.`permission` not in (2,3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...