今天早上我的 SQL 感觉不起作用,我需要一些帮助。
我有 3 个主表,它们之间有两个用于多对多关系的中间表:user
、users_groups
、group
、groups_permissions
和permission
. 每个permission
都有一个name
。
我想写一个查询,给定一个权限名称和一个用户 ID,如果权限存在则返回相应的权限 ID ,如果用户有权限,则返回一个值,否则为 NULL。也就是说,我想知道权限是否存在以及用户是否在一个查询中具有权限。输出应如下所示:
|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
和一个LIMIT 1
,但是这样会优化吗?我需要什么索引?是否有另一种方法可以编写此查询来快速轻松地获取我正在寻找的信息?
编辑:对于那些好奇的人,我使用的是 PostgreSQL,但如果可能的话,我希望查询与 db 无关。