0

私はテーブルを持っuserています。user_role

user_roleテーブルには次の 2 つの列があります。

user_id
role_name

「管理者」と「モデレーター」など、同時に複数の役割を持つユーザーを見つけたいと考えています。

このクエリを作成するにはどうすればよいですか?

4

2 に答える 2

3

次のクエリを使用LEFT OUTER JOINして、テーブルを結合し、user管理user_role者とモデレーターに属するすべてのユーザーを検索します。次に、 でDISTINCTカウントを見つけることにより、管理者ロールとモデレーター ロールの両方に属するユーザーのみをフィルター処理しますrole_name。別のロールを追加する場合は、それに応じて HAVING 句で使用される値 2 を変更する必要があります。

SQL Fiddle でデモを表示するには、ここをクリックしてください。

スクリプト:

CREATE TABLE user
(
    user_id     INT         NOT NULL
  , user_name   VARCHAR(20) NOT NULL
);

CREATE TABLE user_role
(
    user_id     INT         NOT NULL
  , role_name   VARCHAR(20) NOT NULL
);

INSERT INTO user (user_id, user_name) VALUES
    (1, 'user 1'),
    (2, 'user 2'),
    (3, 'user 3'),
    (4, 'user 4'),
    (5, 'user 5'),
    (6, 'user 6');

INSERT INTO user_role (user_id, role_name) VALUES
    (1, 'admin'),
    (1, 'moderator'),
    (3, 'moderator'),
    (2, 'admin'),
    (5, 'admin'),
    (2, 'moderator'),
    (5, 'admin'),
    (4, 'moderator'),
    (4, 'moderator');

SELECT          u.user_id
            ,   u.user_name
FROM            user        u
LEFT OUTER JOIN user_role   ur
ON              ur.user_id  = u.user_id
WHERE           ur.role_name IN ('admin', 'moderator')
GROUP BY        u.user_id
HAVING          COUNT(DISTINCT ur.role_name) = 2;

出力:

USER_ID USER_NAME 
------- ---------
   1    user 1
   2    user 2
于 2012-04-30T00:58:38.160 に答える
0

管理者のフィルタリング用とモデレーター用の 2 つの参加が必要です。

SELECT user.*
FROM user
INNER JOIN user_role admins
ON admins.user_id = user.id
AND admins.role_name = 'admin'
INNER JOIN user_role mods
ON mods.user_id = user.id
AND mods.role_name = 'moderator'
于 2012-04-30T00:36:02.687 に答える