Вы можете использовать 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'
Если список флагов очень длинный и имеется много совпадений, первое, вероятно, быстрее. Если список флагов короткий, а совпадений мало, вы, вероятно, обнаружите, что второй быстрее. Если производительность вызывает беспокойство, попробуйте протестировать обе эти данные, чтобы увидеть, какие из них работают лучше.