GROUP BY
のいずれかを使用できます およびHAVING COUNT(*) = _
:
SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list
(contact_id, flag
を想定 ユニークです。
または、結合を使用します:
SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'
フラグのリストが非常に長く、一致するものがたくさんある場合は、最初の方がおそらく高速です。フラグのリストが短く、一致するものがほとんどない場合は、おそらく2番目の方が速いことがわかります。パフォーマンスが懸念される場合は、両方のデータをテストして、どちらが最適かを確認してください。