Pikirkan tentang apa yang dilakukan kode Anda secara logis:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
setara dengan
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Tidak mungkin tag.tag_id
dapat memenuhi kedua kondisi secara bersamaan, jadi AND tidak pernah benar.
Sepertinya versi ATAU yang Anda kutip dalam pertanyaan Anda adalah yang benar-benar Anda inginkan:
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) ) );
Menggunakan klausa IN lebih tepat, Anda dapat menulisnya sebagai:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Satu catatan terakhir, karena Anda mereferensikan kolom dari tabel LEFT JOINed di klausa WHERE Anda (tag.tag_id
), Anda benar-benar memaksanya untuk berperilaku seperti INNER JOIN. Untuk benar-benar mendapatkan LEFT JOIN, Anda harus memindahkan kriteria dari WHERE dan menjadikannya bagian dari ketentuan JOIN:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);