0

我有 3 个表:用户、角色和角色用户(角色用户是一个有 2 列的关系表,用户 ID 和角色 ID)

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

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

为了显示 :

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

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

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

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

我怎样才能在 SQL 中实现这一点?

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

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)
4

4 回答 4

4

在 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

于 2012-09-10T08:29:41.113 回答
1

试试这个,

它用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
于 2012-09-10T08:26:51.757 回答
1

您可以简单地使用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' 
于 2012-09-10T08:28:40.510 回答
0

尝试这样的事情

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'    
于 2012-09-10T08:30:46.423 回答