【问题标题】:How to filter query by related privileges如何按相关权限过滤查询
【发布时间】:2019-11-06 19:07:08
【问题描述】:

我正在尝试编写通过包含至少一个display = 1 权限来过滤用户的选择。我的表格如下所示:

User:
-id
-user_email_id

UserGroupRelation:
-id
-user_id
-user_email_id
-user_group_id

UserGroupPermission
-id
-permission_id
-display(bool)
-user_group_id

一个用户,可以有多个组和分配给组的权限。我想选择组中的所有用户,这些用户至少具有一项权限且显示设置为 1。我该怎么做?

这是我尝试过的,但没有成功。

SELECT *
FROM User as u
LEFT OUTER JOIN
    UserGroupRelation as ugr on ugr.user_id = u.id and ugr.user_email_id = u.user_email_id
LEFT OUTER JOIN
    UserGroupPermission as ugp on ugp.user_group_id = ugr.user_group_id
WHERE
    ugp.display = 1

我认为问题在于用户有多个组关系并且组有多个权限。也许我应该在 FROM 子句中使用另一个选择?

样本数据:

  User:
    {id=1, user_email_id=1}, 
    {id=2, user_email_id=2}

  UserGroupRelation: 
    {id-1, user_group_id=1, user_id=1, user_email_id=1}, 
    {id=2, usergroup_id=2, user_id=2, user_email_id=2}

  UsergroupPermission: 
    {id=1, permission_id=1, display=1, user_group_id=1}, 
    {id=2, permission_id=1, display=0, user_group_id=2}

结果应该只返回 id=1 的用户,因为他连接到 group_id = 1,该用户具有 display=1 的权限,id 为 2 的用户不在结果中,因为他具有 display=0 的权限。这很简单例如,因为用户可以有多个组,组可以有多个权限,但结果中只需要一个 h as display = 1 的权限

【问题讨论】:

  • 我一直在尝试在 UserGroupRelation 和 UserGroupPermission 上使用左外连接,然后在哪里 display = 1 但我得到了意想不到的结果
  • 您是否偶然错过了 UserGroupRelation 之前的 join 语句?
  • 我认为表连接正确,但可能我需要使用一些子查询,对具有 display=1 或类似内容的 Permission 行进行计数,然后 WHERE count > 0
  • 您在问题中发布的 SQL 在 users as uUserGroupRelation 之间缺少单词 left outer join - 我想。您尝试连接 2 个表,但只使用了一次连接语法。我假设它是一种类型?
  • 哦,是的,这是一个错字,我重写了它而不是粘贴

标签: sql sql-server


【解决方案1】:

我相信您的 SELECT 只是格式错误。尝试运行以下内容来代替您在上面分享的内容:

SELECT * FROM @User AS u
INNER JOIN UserGroupRelation AS ugr 
    ON ugr.[user_id] = u.id AND ugr.user_email_id = u.user_email_id
LEFT OUTER JOIN UserGroupPermission AS ugp
    ON ugp.user_group_id = ugr.user_group_id
WHERE
    ugp.display = 1;

如果我在测试环境中针对您的示例数据运行此程序,我会收到以下结果集:

+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+
| id | user_email_id | id | user_id | user_email_id | user_group_id | id | permission_id | display | user_group_id |
+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+
|  1 |             1 |  1 |       1 |             1 |             1 |  1 |             1 |       1 |             1 |
+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+

顺便说一句,我会将LEFT OUTER JOIN UserGroupPermission AS ugp 更改为INNER JOIN UserGroupPermission AS ugp,因为您的预期结果集中需要“显示”。

【讨论】:

  • 我的结果中不需要连接表,我只需要它通过至少 1 个将显示设置为 1 的权限来过滤用户
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2021-11-24
相关资源
最近更新 更多