Suy nghĩ về những gì mã của bạn đang làm một cách hợp lý:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
tương đương với
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Không đời nào tag.tag_id
có thể thỏa mãn cả hai điều kiện cùng một lúc, vì vậy AND không bao giờ đúng.
Có vẻ như phiên bản HOẶC mà bạn đã trích dẫn trong câu hỏi của mình là phiên bản bạn thực sự muốn:
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) ) );
Sử dụng mệnh đề IN thích hợp hơn, bạn có thể viết như sau:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Một lưu ý cuối cùng, vì bạn đang tham chiếu một cột từ bảng LEFT JOINed trong mệnh đề WHERE của mình (tag.tag_id
), bạn đang thực sự buộc điều đó phải hoạt động giống như một THAM GIA BÊN TRONG. Để thực sự có được THAM GIA TRÁI, bạn cần phải chuyển các tiêu chí ra khỏi WHERE và biến nó thành một phần của các điều kiện THAM GIA:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);