Помислете какво прави вашият код логически:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
е еквивалентен на
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Няма начин tag.tag_id
може да удовлетвори и двете условия едновременно, така че И никога не е вярно.
Изглежда, че версията ИЛИ, която цитирахте във вашия въпрос, е тази, която наистина искате:
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) ) );
Използвайки клаузата IN по-подходящо, можете да напишете това като:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Една последна забележка, защото препращате към колона от таблицата LEFT JOINed във вашата клауза WHERE (tag.tag_id
), вие наистина го принуждавате да се държи като INNER JOIN. За да получите наистина LEFT JOIN, ще трябва да преместите критериите от WHERE и вместо това да го направите част от условията JOIN:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);