Мой смысл SQL не работает этим утром, и я нуждаюсь в некоторой помощи.
У меня есть 3 первичных таблицы с двумя промежуточными столами между ними используемый для many-many отношений: пользователь
, users_groups
, группа
, groups_permissions
и разрешение
. Каждый у разрешения
есть имя
.
Я хотел бы написать вопрос, который, учитывая имя разрешения и идентификатор пользователя, возвращает соответствующий id разрешения , если разрешение существует , и также возвращает стоимость, если у пользователя еще есть разрешение ПУСТОЙ УКАЗАТЕЛЬ. То есть я хочу знать и если разрешение существует и если у пользователя есть разрешение в одном вопросе. Продукция должна выглядеть примерно так:
|has_permission | does_not_have_permission
-------------------------------------------------------------------
permission_exists | (1,1) | (1,NULL)
permission_does_not_exist| N/A | [0 rows]
Прямо сейчас вопрос, о котором я могу думать, выглядит примерно так:
SELECT p.id, ug.user_id
FROM permission AS p LEFT JOIN
groups_permissions AS gp ON p.id = gp.permission_id LEFT JOIN
group AS g ON gp.group_id = g.id LEFT JOIN
users_groups AS ug ON ug.group_id = g.id AND ug.user_id = ?
WHERE p.name = ?;
Проблема состоит в том, что это возвращает больше чем один ряд в определенных случаях. Я мог бросить ORDER BY u.id DESC
и ПРЕДЕЛ 1
на него, я думаю, но это оптимизирует хорошо? Каковы индексы, в которых я нуждаюсь для этого? Есть ли иначе, что я мог написать этот вопрос, чтобы получить информацию, которую я ищу быстро и легко?
править: для тех, кому любопытно, я использую PostgreSQL, хотя я хотел бы, чтобы вопрос был db агностиком, если это возможно.