私はテーブルを持っuser
ています。user_role
user_role
テーブルには次の 2 つの列があります。
user_id
role_name
「管理者」と「モデレーター」など、同時に複数の役割を持つユーザーを見つけたいと考えています。
このクエリを作成するにはどうすればよいですか?
次のクエリを使用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
管理者のフィルタリング用とモデレーター用の 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'