Přemýšlejte o tom, co váš kód logicky dělá:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
je ekvivalentní k
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Neexistuje žádný způsob, jak tag.tag_id
může splňovat obě podmínky současně, takže AND není nikdy pravdivé.
Vypadá to, že verze OR, kterou jste uvedli ve své otázce, je ta, kterou opravdu chcete:
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) ) );
Vhodnějším použitím klauzule IN byste to mohli napsat jako:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Jedna poznámka na závěr, protože odkazujete na sloupec z tabulky LEFT JOINed v klauzuli WHERE (tag.tag_id
), opravdu to nutíte, aby se chovali jako INNER JOIN. Abyste skutečně získali LEFT JOIN, museli byste přesunout kritéria z WHERE a začlenit je do podmínek JOIN:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);