Tänk på vad din kod gör logiskt:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
motsvarar
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Det går inte att tag.tag_id
kan uppfylla båda villkoren samtidigt, så OCH är aldrig sant.
Det ser ut som att OR-versionen du citerade i din fråga är den du verkligen vill ha:
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) ) );
Om du använder IN-satsen mer lämpligt kan du skriva det som:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
En sista notering, eftersom du hänvisar till en kolumn från tabellen LEFT JOINed i din WHERE-sats (tag.tag_id
), tvingar du verkligen det att bete sig som en INNER JOIN. För att verkligen få en LEFT JOIN, måste du flytta kriteriet från WHERE och göra det till en del av JOIN-villkoren istället:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);