SQL の同じ列で複数の条件に一致するレコードを選択します
SQL クエリでは、同じ列の複数の条件に一致するレコードを取得する必要がある場合があります。ただし、同じ列に対して複数の WHERE 句を使用するだけでは、必ずしも期待どおりの結果が得られるわけではありません。次の例を考えてみましょう:
連絡先と各連絡先のステータスを示すフラグを含むデータベース テーブルがあります。テーブルには次のデータが含まれています:
ID | contactid | flag | flag_type |
---|---|---|---|
118 | 99 | Volunteer | 1 |
119 | 99 | Uploaded | 2 |
120 | 100 | Via Import | 3 |
121 | 100 | Volunteer | 1 |
122 | 100 | Uploaded | 2 |
目標は、「ボランティア」と「アップロード済み」の両方のフラグ条件に一致する連絡先 ID のみを返すことです。次のクエリを使用します:
<code class="language-sql">SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'</code>
各条件は特定のフラグ値のみをチェックするため、結果は返されません。必要なデータを取得するには、別の方法を使用する必要があります。
GROUP BY と HAVING を使用します
解決策の 1 つは、GROUP BY 句と HAVING 句を使用することです。次のクエリは、結果を contactid ごとにグループ化し、一致するフラグ値の数をカウントします:
<code class="language-sql">SELECT contact_id FROM your_table WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY contact_id HAVING COUNT(*) = 2 -- 必须与WHERE flag IN (...)列表中的数字匹配</code>
「ボランティア」フラグと「アップロード済み」フラグの両方が付いているコンタクトは 2 としてカウントされます。次に、HAVING 句によって結果がフィルタリングされ、これらの連絡先のみが含まれるようになります。
接続を使用する
もう 1 つの方法は、接続を使用することです。次のクエリは、your_table テーブルで自己結合を実行します:
<code class="language-sql">SELECT T1.contact_id FROM your_table T1 JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded' -- // 如果需要,可以添加更多连接 WHERE T1.flag = 'Volunteer'</code>
このクエリは、「Volunteer」フラグと「Uploaded」フラグの両方を持つすべての連絡先の組み合わせを含む一時テーブルを作成します。次に、WHERE 句によって結果がフィルター処理され、これら 2 つの条件を満たす連絡先のみが含まれます。
メソッドの選択
同じ列で複数の条件を持つレコードを選択する最良の方法は、データのサイズと構造によって異なります。一致基準の長いリストを含む大規模なデータ セットの場合は、GROUP BY および HAVING ソリューションの方が効率的である可能性があります。一致基準のリストが短い小さなデータ セットの場合は、JOIN ソリューションの方が高速な場合があります。
以上がSQLで同じ列の複数の基準に一致するレコードを選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。