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
Ao remover
HAVING COUNT(*)
, você obtém OR
em vez de AND
(embora não seja a maneira mais eficiente) Ao substituir
3
com 2
, você obtém usuários que têm exatamente duas das três tags definidas. Ao substituir
= 3
com >= 2
, você obtém usuários que têm pelo menos duas das três tags definidas.