मेरा परीक्षण स्कीमा, डेटा और क्वेरी: 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 उत्तर
यदि आप एक पंक्ति प्रति कार चाहते हैं तो आपको एकत्रीकरण की आवश्यकता है। मुझे लगता है कि आप जो चाहते हैं वह है:
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
पर प्राथमिक कुंजी बना दिया है।
संबंधित सवाल
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।