मेरा परीक्षण स्कीमा, डेटा और क्वेरी: https://www.db-fiddle.com /f/apQXP7MGfDKPHVw6ucmuNv/1

मेरी क्वेरी को केवल उन कारों का चयन करना चाहिए जो सभी IN () भाग सुविधाओं से मेल खाती हैं, और NOT IN () में से कोई नहीं, और इसे केवल एक बार मिलान करने वाली कार का चयन करना चाहिए।

मेरे नमूना डेटा में, जब मैं क्वेरी चलाता हूं, तो मुझे दो कॉलम के साथ एक पंक्ति देखने की उम्मीद होती है, जिसमें आईडी और एकमात्र कार का नाम होता है जो आईएन () भाग में सुविधाओं की सूची से मेल खाता है, जहां खंड मिलान किए बिना जहां क्लॉज के NOT IN () भाग में सुविधाओं की सूची:

1 | camry

इसके बजाय, मुझे एक पंक्ति मिलती है जिसमें हर बार कार का नाम होता है, जहां कार खंड के IN () भाग में से किसी एक मान से मेल खाती है:

1 | camry    | 2 | 1 | 2 | 2 | backup camera
1 | camry    | 3 | 1 | 3 | 3 | sun roof
2 | forester | 4 | 2 | 2 | 2 | backup camera
2 | forester | 5 | 2 | 3 | 3 | sun roof
1
the8thbit 7 अक्टूबर 2020, 17:09

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप एक पंक्ति प्रति कार चाहते हैं तो आपको एकत्रीकरण की आवश्यकता है। मुझे लगता है कि आप जो चाहते हैं वह है:

SELECT c.id, c.name
FROM `car` c JOIN
     `bridge_car_features` cf  
      ON car.id = bridge.car_id JOIn
      `features` f  
      ON cf.features_id = f.id 
GROUP BY c.id
HAVING SUM(f.name IN ('backup camera', 'sun roof')) > 0 AND  -- has at least one of these
       SUM(f.name IN ('four wheel drive')) = 0;              -- has none of these

यह रहा एक fiddle

नोट: फिडेल के काम करने के लिए, मैंने id को cars पर प्राथमिक कुंजी बना दिया है।

1
Gordon Linoff 7 अक्टूबर 2020, 17:13