0

私は次のようなテーブルを持っています:

users         roles        users_roles
-id (pk)      -id (pk)     -user_id (fk) references users
-username     -name        -role_id (fk) references roles
-password

ロール列に3つのレコードがあります(ROLE_USER、ROLE_MODERATOR、ROLE_TESTER)

inユーザーと多対多の役割の関係。管理者が選択ボックスでの選択に応じてユーザーを検索できるフォームフィールド(複数の選択オプションを持つ役割を含む選択ボックス)があります。

管理者がROLE_USERとROLE_MODERATORの両方を選択するとします。単一のクエリを記述して、この両方の役割を持つユーザーを見つけるにはどうすればよいですか(これらの役割の1つだけを持つユーザーを除外します)

これがsqlfiddleリンクですhttp://sqlfiddle.com/#!2/214b8/3

ユーザーに両方の役割(ROLES_USERとROLES_MODERATOR)を持たせたいのですが。ユーザーは両方の役割を持っている必要があります

4

2 に答える 2

2

これを試して。

SELECT DISTINCT users.id, users.username,group_concat(distinct roles.name) as role_names
FROM users
INNER JOIN users_roles ON users.id = users_roles.user_id
INNER JOIN roles ON roles.id = users_roles.role_id
WHERE roles.name = 'ROLE_USER' OR roles.name = 'ROLE_MODERATOR'
GROUP by users.id HAVING (role_names = 'ROLE_USER,ROLE_MODERATOR' OR role_names = 'ROLE_MODERATOR,ROLE_USER');

このクエリをカスタマイズして、必要な列をフェッチし、必要に応じてグループ化を追加できます。

私はこのクエリ構造に完全に満足しているわけではありませんが、一時的な解決策として提供しました。MySQLの専門家からコメントをいただければ幸いです。

于 2013-02-15T15:53:47.353 に答える
1

あなたは使用する必要がありGROUP BYますHAVING

SELECT user_id 
FROM users_roles 
WHERE role_id iN (1,2)
GROUP BY user_id 
HAVING COUNT(DISTINCT role_id) = 2

ここにいくつかのサンプルフィドルがあります。

そして、あなたがJOINあなたの他のテーブルに行く必要があるならば:

SELECT u.id, u.username
FROM users u 
    JOIN users_roles ur on u.id = ur.user_id
    JOIN roles r on ur.role_id = r.id
WHERE r.id iN (1,2)
GROUP BY u.id, u.username
HAVING COUNT(DISTINCT r.id) = 2
于 2013-02-15T16:03:27.493 に答える