Оператор SQL проверяет, разрешен ли пользователь - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующие три таблицы:

шаблоны <-----> templatesubscription <-----> пользователь

table template:
id | name

table user
id | name | ...

table templatesubscriptions
id | template_id | user_id
  • Каждый пользователь может иметь n шаблонных подписок .
  • Каждая шаблонная подписка может иметь 1 user .
  • Каждый шаблон имеет n шаблонных подписок .
  • Каждая шаблонная подписка имеет 1 шаблон .

Теперь я хочу проверить, может ли текущий вошедший в систему пользователь (идентификатор пользователя = 10) редактировать шаблон с идентификатором = 0. Только если у пользователя есть подписка на этот шаблон, он может редактировать его.

Теперь я мог сделать 2 запроса. Сначала я получу подписку на шаблон текущего пользователя с идентификатором шаблона:

SELECT * FROM templatesubscription WHERE user_id = 10 AND template_id = 0

Теперь я могу проверить, является ли возвращаемое значение нулевым, если да, пользователь получит сообщение об ошибке. Если результат не пустой, я получу шаблон таблицы шаблонов:

SELECT * FROM templates WHERE id = 0

Но этот подход не кажется мне очень приятным. Могу ли я объединить оба утверждения в одном запросе? Возвращаемое значение должно быть шаблоном или нулевым, если у пользователя нет подписки на этот шаблон.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Узнайте о соединениях, вот хороший обзор .

Таким образом, в вашем случае вы хотите внутреннее объединение подписок и шаблонов, чтобы получить только те подписки, к которым у пользователя есть доступ:

SELECT t.* -- it's better to list all the columns than use *
  FROM templates t
 INNER
  JOIN templatesubscription ts
    ON t.id = ts.template_id
 WHERE ts.user_id = 10
   AND ts.template_id = 0

Таким образом, это вернет строки (строк) из таблицы templates, только если в templatesubscription есть запись для этого user_id.

0 голосов
/ 08 апреля 2019

Вы можете получить их вместе, используя условие where. Просто есть вывод, если у пользователя есть разрешение.

SELECT * 
FROM templates 
WHERE id = 0 and 1=(SELECT 1 FROM templatesubscription WHERE user_id = 10 AND template_id = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...