SELECT u.*
FROM (
SELECT user_id
FROM tag t
JOIN user_has_tag uht
ON uht.tag_id = t.id
WHERE tag_name IN ('apple', 'orange', 'banana')
GROUP BY
user_id
HAVING COUNT(*) = 3
) q
JOIN user u
ON u.id = q.user_id
Usuwając HAVING COUNT(*)
, otrzymasz OR
zamiast AND
(choć nie będzie to najskuteczniejszy sposób)
Zastępując 3
z 2
, otrzymujesz użytkowników, którzy mają dokładnie dwa z trzech zdefiniowanych tagów.
Zastępując = 3
z >= 2
, otrzymasz użytkowników, którzy mają co najmniej dwa z trzech zdefiniowanych tagów.