Denken Sie logisch darüber nach, was Ihr Code tut:
( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )
entspricht
( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
Es gibt keine Möglichkeit tag.tag_id
kann beide Bedingungen gleichzeitig erfüllen, also ist das UND niemals wahr.
Es sieht so aus, als ob die OR-Version, die Sie in Ihrer Frage zitiert haben, die ist, die Sie wirklich wollen:
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) ) );
Wenn Sie die IN-Klausel besser verwenden, könnten Sie dies folgendermaßen schreiben:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
WHERE tag.tag_id in (1,2);
Eine letzte Anmerkung, weil Sie in Ihrer WHERE-Klausel (tag.tag_id
) auf eine Spalte aus der LEFT JOINed-Tabelle verweisen ), zwingen Sie das wirklich dazu, sich wie ein INNER JOIN zu verhalten. Um wirklich einen LEFT JOIN zu erhalten, müssten Sie die Kriterien aus dem WHERE verschieben und es stattdessen zu einem Teil der JOIN-Bedingungen machen:
SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id
AND tag.tag_id in (1,2);