इस बारे में सोचें कि आपका कोड तार्किक रूप से क्या कर रहा है:
( 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
में LEFT JOINed टेबल से एक कॉलम को रेफर कर रहे हैं। ), आप वास्तव में इसे इनर जॉइन की तरह व्यवहार करने के लिए मजबूर कर रहे हैं। वास्तव में 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);