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
Eliminando HAVING COUNT(*) , obtienes OR en lugar de AND (aunque no será la forma más eficiente)
Reemplazando 3 con 2 , obtienes usuarios que tienen exactamente dos de tres etiquetas definidas.
Reemplazando = 3 con >= 2 , obtienes usuarios que tienen al menos dos de tres etiquetas definidas.