ホームページ >データベース >mysql チュートリアル >SQL で複数のロール ID を持つ個別のユーザー ID を選択する方法は?

SQL で複数のロール ID を持つ個別のユーザー ID を選択する方法は?

DDD
DDDオリジナル
2025-01-19 16:57:09774ブラウズ

How to Select Distinct User IDs with Multiple Role IDs in SQL?

複数の行にわたって特定のロール ID 基準を満たすユーザー ID を取得する

この記事では、データベース テーブル内の異なる行にまたがる複数のロール ID 条件を満たす一意のユーザー ID を選択するという課題について説明します。 userrole 列と userid 列を持つ roleid テーブルを考えてみましょう:

userid roleid
1 1
1 2
1 3
2 1

目標は、userid 値 1、2、および 3 に関連付けられたすべての個別の roleid 値を識別することです。サンプル データを使用すると、期待される出力は userid 1 になります。2 つの SQL アプローチでこれを達成できます。

方法 1: HAVING 句を使用した集計クエリ

このメソッドは集計関数と HAVING 句を利用します:

<code class="language-sql">SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP BY userid
HAVING COUNT(DISTINCT roleid) = 3;</code>

このクエリは、最初に roleid が 1、2、または 3 である行をフィルターします。次に、結果を userid ごとにグループ化し、以下を使用して各ユーザーの 個別の roleid 値の数をカウントします。 COUNT(DISTINCT roleid)HAVING 句は、正確に 3 つの異なるロール ID を持つユーザーのみを含むようにフィルター処理します。

方法 2: 自己結合クエリ

特に大規模なデータセットの場合、より効率的な代替手段は、自己結合アプローチです。

<code class="language-sql">SELECT DISTINCT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t1.userid = t3.userid AND t3.roleid = 3
WHERE t1.roleid = 1;</code>

このクエリは 3 つの自己結合を使用します。t1roleid 1 でユーザーを選択します。 t2roleid 2 も持っていることを保証します。 t3 は、roleid 3 があることを確認します。DISTINCT は、一意の userid 値のみが返されることを保証します。

最適なアプローチ (集計と結合) は、テーブルのサイズとデータの分散によって異なります。 行が一致する可能性が低いシナリオでは、自己結合メソッドのパフォーマンスが向上する傾向があります。

以上がSQL で複数のロール ID を持つ個別のユーザー ID を選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。