【问题标题】:sql join relationship - if an entry is found, then don't selectsql join 关系 - 如果找到条目,则不要选择
【发布时间】:2012-09-10 08:23:06
【问题描述】:

我有 3 个表:users、roles 和 roles_users(roles_users 是一个有 2 列的关系表,user_id 和 role_id)

通过roles_users 表,一个用户可以拥有多个角色。

如果用户具有特定角色,我如何构建不会选择用户的选择查询。

为了说明:

  • 超级管理员用户具有超级管理员、管理员、登录和发布者角色。

  • 管理员用户具有管理员、登录和发布者角色。

  • 发布者用户具有登录和发布者角色。

我想选择所有没有超级管理员角色的用户。 换句话说,如果用户具有超级管理员角色,则不要选择它。

如何在 SQL 中实现这一点?

编辑:这是最后对我有用的查询:(感谢András Ottó's 回答)

SELECT DISTINCT(users.id), users.*
FROM users
INNER JOIN roles_users on users.id = roles_users.user_id
INNER JOIN roles ON roles_users.role_id = roles.id
WHERE NOT EXISTS(SELECT roles_users.user_id FROM roles_users
      WHERE roles_users.user_id = users.id AND roles_users.role_id = 2)

【问题讨论】:

    标签: sql join


    【解决方案1】:

    在 Oracle 上的 Sql Server 中你可以尝试:

    SELECT users.*, roles.roleName
    FROM users
    INNER JOIN roles_users on users.userid = roles_users.userid
    INNER JOIN roles ON roles_users.roleID = roles.roleID
    WHERE NOT EXISTS(SELECT roles_users.userID FROM roles_users
          WHERE roles_users.userID = users.userid AND roleName = 'super admin')
    

    这是SQL Fiddle

    【讨论】:

    • 其他答案仍然给我超级管理员用户,因为在 where not exists 部分缺少一些东西......
    【解决方案2】:

    试试这个,

    它使用subquery

    SELECT  a.*
    FROM    users a
            INNER JOIN roles_use b
                on a.user_id = b.user_id
    WHERE   b.role_id NOT IN
            (
                SELECT role_id
                FROM roles
                WHERE rolename = 'super admin'
            )
    

    使用left join

    SELECT  a.*
    FROM    users a
            LEFT JOIN roles_use b
                on a.user_id = b.user_id
            LEFT JOIN roles c
                ON b.role_id = c.role_id AND
                   c.roleName = 'super admin'
    WHERE   c.role_id IS NULL
    

    【讨论】:

      【解决方案3】:

      您可以简单地使用JOIN 来解决您的问题....

      如果您有要限制的角色列表,请按以下方式使用NOT IN

      SELECT a.* FROM users a INNER JOIN users_role b ON a.user_id= b.user_id 
      INNER JOIN roles c ON b.role_id = c.role_id 
      WHERE c.role_name NOT IN ('SUPER ADMIN') 
      

      如果您要限制一个角色,请按以下方式使用!=

      SELECT a.* FROM users a INNER JOIN users_role b ON a.user_id= b.user_id 
      INNER JOIN roles c ON b.role_id = c.role_id 
      WHERE c.role_name != 'SUPER ADMIN' 
      

      【讨论】:

        【解决方案4】:

        试试这样的

        SELECT  u.*
        FROM    users u 
        JOIN    roles_users ru
        ON      u.user_id=ru.user_id
        JOIN    roles r
        ON      r.role_id=ru.role_id   
        WHERE   rol_name !='Super admin'    
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-07
          • 2022-01-18
          • 2012-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多