Denk na over wat uw code logisch doet:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
is gelijk aan
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Er is geen manier tag.tag_id
kan tegelijkertijd aan beide voorwaarden voldoen, dus de AND is nooit waar.
Het lijkt erop dat de OR-versie die u in uw vraag noemde, de versie is die u echt wilt:
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) ) );
Als u de IN-clausule beter gebruikt, zou u dat kunnen schrijven als:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Een laatste opmerking, omdat je verwijst naar een kolom uit de LEFT JOINed-tabel in je WHERE-clausule (tag.tag_id
), je dwingt dat echt om je te gedragen als een INNER JOIN. Om echt een LEFT JOIN te krijgen, moet je de criteria uit de WHERE halen en in plaats daarvan onderdeel maken van de JOIN-voorwaarden:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);