コードが論理的に何をしているのか考えてみてください:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
と同等です
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
tag.tag_id
はありません 両方の条件を満たすことができるため、ANDが真になることはありません。
質問で引用したORバージョンが本当に必要なもののようです:
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);
最後に、WHERE句(tag.tag_id
)でLEFTJOINedテーブルの列を参照しているためです。 )、あなたは本当にそれをINNERJOINのように振る舞わせています。 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);