Вот еще один подход, позволяющий избежать необходимости программно добавлять подзапросы к предложению WHERE:
Запрос:
SELECT count(person.id) AS numPeople, person
FROM Person as person
INNER JOIN
person.memberships AS mships
WITH mships.group.id IN (:groupIds)
GROUP BY person.id
HAVING COUNT(person.id) = (:numOfGroupIds)
И некоторые примеры значений:
[
groupIds: [8,9,439,86843]
numOfGroupIds: 4
]
Часть этого запроса вплоть до GROUP BY собирает всех людей, которые соответствуют любой групп. Затем, сгруппировав по человеку и проверив, что количество результатов равно числу групп в списке, вы можете проверить, что этот человек является членом всех указанных групп.