複数の行にわたって特定のロール 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 つの自己結合を使用します。t1
は roleid
1 でユーザーを選択します。 t2
は roleid
2 も持っていることを保証します。 t3
は、roleid
3 があることを確認します。DISTINCT
は、一意の userid
値のみが返されることを保証します。
最適なアプローチ (集計と結合) は、テーブルのサイズとデータの分散によって異なります。 行が一致する可能性が低いシナリオでは、自己結合メソッドのパフォーマンスが向上する傾向があります。
以上がSQL で複数のロール ID を持つ個別のユーザー ID を選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。