Tænk over, hvad din kode logisk gør:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
svarer til
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Der er ingen måde tag.tag_id
kan opfylde begge betingelser på samme tid, så OG er aldrig sandt.
Det ser ud til, at den OR-version, du citerede i dit spørgsmål, er den, du virkelig ønsker:
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) ) );
Hvis du bruger IN-sætningen mere passende, kan du skrive det som:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
En sidste bemærkning, fordi du refererer til en kolonne fra tabellen LEFT JOINed i din WHERE-sætning (tag.tag_id
), tvinger du virkelig det til at opføre sig som en INNER JOIN. For virkelig at få et LEFT JOIN, skal du flytte kriterierne ud af WHERE og gøre det til en del af JOIN-betingelserne i stedet:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);