Puedes usar GROUP BY
y 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
(asumiendo contact_id, flag
es único).
O use uniones:
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'
Si la lista de banderas es muy larga y hay muchas coincidencias, la primera probablemente sea más rápida. Si la lista de banderas es corta y hay pocas coincidencias, probablemente encontrarás que la segunda es más rápida. Si le preocupa el rendimiento, intente probar ambos en sus datos para ver cuál funciona mejor.