0

users、roles、roles_usersの3つのテーブルがあります(roles_usersは、user_idとrole_idの2つの列を持つリレーショナルテーブルです)

ユーザーは、roles_users テーブルを通じて、多くのロールを持つことができます。

ユーザーが特定の役割を持っている場合、ユーザーを選択しない選択クエリを作成するにはどうすればよいですか。

説明する :

  • スーパー管理者ユーザーには、スーパー管理者、管理者、ログイン、公開者の役割があります。

  • 管理者ユーザーには、管理者、ログイン、公開者の役割があります。

  • パブリッシャー ユーザーには、ログイン ロールとパブリッシャー ロールがあります。

スーパー管理者の役割を持たないすべてのユーザーを選択したいと考えています。つまり、ユーザーがスーパー管理者の役割を持っている場合は、それを選択しないでください。

SQL でこれを達成するにはどうすればよいですか?

編集:これが最後に私のために働いたクエリです:AndrásOttóの回答に感謝します)

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

制限する役割が 1 つある場合は!=、次のように使用します。

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 に答える