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
Ved at fjerne HAVING COUNT(*) , får du OR i stedet for AND (selvom det ikke vil være den mest effektive måde)
Ved at erstatte 3 med 2 , får du brugere, der har præcis to af tre tags defineret.
Ved at erstatte = 3 med >= 2 , får du brugere, der har defineret mindst to af tre tags.