Réfléchissez à ce que votre code fait logiquement :
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
est équivalent à
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Il n'y a aucun moyen tag.tag_id
peut satisfaire les deux conditions en même temps, donc le ET n'est jamais vrai.
Il semble que la version OR que vous avez citée dans votre question soit celle que vous voulez vraiment :
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE ( ( 1 IN (tag.tag_id) ) OR ( 2 IN (tag.tag_id) ) );
En utilisant la clause IN de manière plus appropriée, vous pouvez écrire cela comme :
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Une dernière remarque, car vous faites référence à une colonne de la table LEFT JOINed dans votre clause WHERE (tag.tag_id
), vous forcez vraiment cela à se comporter comme un INNER JOIN. Pour vraiment obtenir un LEFT JOIN, vous devez déplacer les critères hors de WHERE et les intégrer aux conditions JOIN à la place :
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);