Imperial777
@Imperial777
веб-юниор

Как сделать проверку запросом на соответствие всем условиям?

Здравствуйте. Помогите составить запрос. Решение по идее элементарное, но додуматься не могу...
Суть - к каждой категории форума можно задавать права доступа (rights). Нужно сделать проверку - если у пользователя есть все права доступа, заданные для данной категории (а их может быть несколько) - тогда его можно пускать в раздел. Я пробовала составлять запросы с JOIN'ами, но они выводят только совпадающие строки, а мне нужно полное соответствие.

Таблица с правами категорий prs_rights_forum
id
category_id
right_id

Таблица с правами пользователя prs_rights_users
id
user_id
right_id
  • Вопрос задан
  • 2294 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT COUNT(*) 
    FROM (SELECT `right_id` 
              FROM `prs_rights_forum` 
              WHERE `category_id` = :category) 
        AS `forum`
    LEFT JOIN (SELECT `right_id` 
                   FROM `prs_rights_users` 
                   WHERE `user_id` = :user) 
        AS `user` USING(`right_id`)
    WHERE `user`.`right_id` IS NULL

Возвращает количество отсутствующих у пользователя прав, 0 - есть все права.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SELECT COUNT(right_id) FROM `prs_rights_forum` WHERE category_id=1 AND right_id NOT IN 
    (SELECT right_id FROM `prs_rights_users` WHERE user_id=2)

Вернет количество прав, которых не хватает пользователю с user_id=2 для доступа к разделу category_id=1. Если возвращает 0, значит пользователя можно пускать.

Если вместо COUNT(right_id) выбирать right_id, то получится список прав, которых не хватает пользователю.
Ответ написан
Комментировать
@allexp
web-developer
Можно подсчитывать по количеству прав.
SELECT (
  SELECT COUNT( prf.right_id )
  FROM prs_rights_forum AS prf
  WHERE prf.category_id = 1
) AS rights_count,
(
  SELECT COUNT( pru.right_id )
  FROM prs_rights_users AS pru
  WHERE pru.user_id = 1
  AND right_id
  IN (
    SELECT right_id
    FROM prs_rights_forum
    WHERE category_id = 1
  )
) AS user_rights_count

А проверка будет условием if (user_rights == user_rights_count) - значит все права есть.
Но это только если в обоих таблицах строки не дублируются(а этого быть не должно, иначе еще DISTINCT нужно будет добавить).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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