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
Durch Entfernen von HAVING COUNT(*) , erhalten Sie OR statt AND (obwohl es nicht der effizienteste Weg sein wird)
Durch Ersetzen von 3 mit 2 erhalten Sie Benutzer, für die genau zwei von drei Tags definiert sind.
Durch Ersetzen von = 3 mit >= 2 erhalten Sie Benutzer, für die mindestens zwei von drei Tags definiert sind.