Puoi utilizzare GROUP BY
e 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
(supponendo contact_id, flag
è unico).
Oppure usa i join:
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'
Se l'elenco delle bandiere è molto lungo e ci sono molte corrispondenze, la prima è probabilmente più veloce. Se l'elenco delle bandiere è breve e ci sono poche corrispondenze, probabilmente scoprirai che la seconda è più veloce. Se le prestazioni sono un problema, prova a testare entrambi i tuoi dati per vedere quale funziona meglio.