2

1 と 4 の 2 つの役割しか持たないすべてのユーザーを取得したいと思います。

1 つのユーザー ロールは次のように保存されます。

user_id role_id
54321   1
54321   4
54322   1
54323   1

user_id 54321 を取得するクエリを作成する方法

WHERE role_id IN (1, 4) を使用できますが、これは他のロールを持つユーザーも取得します。

4

3 に答える 3

1

これは、set-within-sets クエリの例です。group by私はこれらをand で解決するのが好きhavingです。これが最も一般的なアプローチだからです。

select user_id
from user_roles ur
group by user_id
having sum(role_id = 1) > 0 and
       sum(role_id = 4) > 0 and
       sum(role_id not in (1, 4)) = 0;

このhaving節には 3 つの条件があります。1 つ目はそのロールが 1 である回数をカウントし、そのuser_idようなロールが少なくとも 1 つあればパスします。2 番目は 4 に対して同じことを行います。最後のチェックは、他の値がないことを確認します。

柔軟性があるので、私はこの構造が好きです。条件が 1 と 4 で、その他が許可されている場合は、3 番目の句を削除するだけです。条件が 1 または 4 で、それ以外の条件がない場合は、次のようになります。

having (sum(role_id = 1) > 0 or
        sum(role_id = 4) > 0
       ) and
       sum(role_id not in (1, 4)) = 0;
于 2013-09-09T22:24:58.587 に答える
0
SELECT u3.user_id
FROM t u1, t u2, t u3
WHERE u1.role_id = 1 AND u2.role_id = 4
 AND u3.user_id = u1.user_id 
 AND u2.user_id = u1.user_id
GROUP BY u3.user_id HAVING COUNT(u3.role_id) = 2;
于 2013-09-09T22:16:25.610 に答える