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 нужно будет добавить).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы