2012-10-31 8 views
5

तो, मुझे कहना है, एसक्यूएल डेवलपर के रूप में मेरी सबसे कमजोर पक्ष है। शायद मैं जो करने की कोशिश कर रहा हूं वह बहुत आसान है। मेरे पास ऐसा कुछ है (यह असली मॉडल नहीं है, लेकिन इसे समझाने में बहुत समय बर्बाद किए बिना इसे समझने में आसान बनाने के लिए, मैं एक उदाहरण के साथ आया हूं जो वास्तव में तालिका संबंधों का उपयोग करता है)। एक तरफ, एक टेबल, चलो इसे कॉल करें, "उपयोगकर्ता"। कॉलम जैसे कि प्राथमिक कुंजी "UserId", "UserName", और इसी तरह।आंतरिक पर अलग का चयन करें एकल कॉलम पर एकाधिक मानों द्वारा क्वेरी फ़िल्टरिंग में शामिल हों?

अगला, एक और तालिका, "लाइसेंस"। संबंधित 1: उपयोगकर्ता के साथ एन, प्रत्येक लाइसेंस एक उपयोगकर्ता से संबंधित है, उपयोगकर्ता के पास कई लाइसेंस हो सकते हैं। तो, हमारे पास एक पीके इडलिकेंस, एक एफके आईडीयूसर होगा, और इसी तरह।

अगला, "उपकरण" नामक एक तालिका। यहां हमने विभिन्न उपकरणों को परिभाषित किया है। IdEquipment, उपकरण नाम। इसके बारे में ज्यादा कुछ नहीं कहना है।

आखिरकार, एक तालिका जो "लाइसेंस" और "उपकरणों" के बीच एन: एम संबंध बनाता है। जब कोई उपयोगकर्ता लाइसेंस को परिभाषित करता है, तो वे विभिन्न उपकरणों को निर्दिष्ट कर सकते हैं जो लाइसेंस उन्हें कुशलतापूर्वक उपयोग करने की अनुमति देता है। इसलिए, एक लाइसेंस कई उपकरणों से संबंधित हो सकता है, और उपकरण का एक टुकड़ा कई लाइसेंस से संबंधित हो सकता है।

असली सौदा यहां आता है। मुझे किसी प्रकार की खोज प्रणाली को लागू करने का आदेश दिया गया है जो आपको उन उपकरणों के आधार पर उपयोगकर्ताओं को प्राप्त करने की अनुमति देता है जिन्हें वे संभालने के लिए योग्य हैं। एक से अधिक चयन करना संभव है, ताकि आप उन उपयोगकर्ताओं की खोज कर सकें जो उपकरण को संभालने के लिए योग्य हैं "ए "," बी "और" सी "। उदाहरण के लिए, हमारे पास 2 उपयोगकर्ता हैं, जेम्स और डेव। जेम्स के पास 2 लाइसेंस हैं, डेव के पास एक है। जेम्स अपने पहले लाइसेंस, "बी" और "सी" पर दूसरी मशीन पर "ए" और "डी" मशीनों का उपयोग करने के लिए योग्य हैं। डेव को अपने एकमात्र लाइसेंस पर उपकरण प्रकार "बी" और "सी" को संभालने के लिए अर्हता प्राप्त की जाती है। यदि कोई उपयोगकर्ता "ए", "बी" और "सी" उपकरण को संभालने में सक्षम होने वाले उपयोगकर्ताओं की तलाश करने का प्रयास करता है, तो केवल जेम्स ही रिकॉर्डिंग रिकॉर्ड होगा।

अब तक मैं मैं मैं कैसे 'ए' 'बी' और 'सी' के लिए सभी 3 अलग idEquipments पर इस फ़िल्टर कर सकते हैं

SELECT DISTINCT IdUser 
FROM Users 
INNER JOIN Licenses 
    ON Licenses.IdUser = Users.idUser 
INNER JOIN LicensesEquipments 
    ON LicensesEquipments.IdLicense = Licenses.IdLicense 
INNER JOIN Equipment 
    ON Equipment.IdEquipment = LicensesEquipments.IdEquipment 

WHERE Equipment.IdEquipment = ?? 

की तरह कुछ करने के लिए होगा ग्रहण किया।? जाहिर है, मैं नहीं बना सकता जहां उपकरण। IdEquipment = 1 और Equipment.IdEquipment = 2 क्योंकि सेल 2 अलग-अलग मानों के बराबर नहीं हो सकता है। न तो मैं कहां कर सकता हूं उपकरण। IdEquipment = 1 या उपकरण। IdEquipment = 2 या एक का उपयोग करने के बाद से इसका मतलब यह होगा कि कम से कम एक संभावना वाले किसी भी उपयोगकर्ता को वैध परिणाम माना जाएगा, और मैं उस व्यक्ति की तलाश कर रहा हूं जिसके पास है इस मामले पर सभी 3 अलग-अलग उपकरण।

सबसे पहले मुझे लगता है कि मुझे उपनाम का उपयोग करके टेबल उपकरण के साथ कई आंतरिक जुड़ना होगा, जितना बार मेरे पास उपकरण पर फ़िल्टर हो सकता है, और प्रत्येक उपनाम को एक अलग फ़िल्टर के साथ उपयोग करना होगा। लेकिन फिर मेरी कोड पर्यवेक्षक द्वारा आया था और, मुझे बताया था इसके बारे में भूल जाते हैं के बाद से उन्होंने कहा कि अधिक से अधिक फिल्टर जहां जोड़ा के रूप में बहुत महंगी प्रस्तुत करना होगा (हालांकि वह मुझे कोई बेहतर विकल्प दिया ...)

उत्तर

4
SELECT Users.idUser 
FROM Users 
INNER JOIN Licenses ON Licenses.IdUser = Users.idUser 
INNER JOIN LicensesEquipments ON LicensesEquipments.IdLicense = Licenses.IdLicense 
INNER JOIN Equipment ON Equipment.IdEquipment = LicensesEquipments.IdEquipment 
WHERE Equipment.IdEquipment IN ('A', 'B', 'C') 
GROUP BY IdUser 
HAVING COUNT(DISTINCT Equipment.IdEquipment) = 3 <--must be # of unique items in IN clause 

हैं आप वास्तव में सिर्फ यूजर आईडी की जरूरत है, आप अपनी क्वेरी से Users और Licenses टेबल ड्रॉप कर सकते हैं:

SELECT Licenses.IdUser 
FROM Licenses 
INNER JOIN LicensesEquipments ON LicensesEquipments.IdLicense = Licenses.IdLicense 
WHERE LicensesEquipments.IdEquipment in ('A', 'B', 'C') 
GROUP BY Licenses.IdUser 
HAVING COUNT(DISTINCT LicensesEquipments.IdEquipment) = 3 

इसके अलावा, कुछ अन्य नामों आसान बनाता है पढ़ने के लिए:

SELECT l.IdUser 
FROM Licenses l 
INNER JOIN LicensesEquipments le ON le.IdLicense = l.IdLicense 
WHERE le.IdEquipment in ('A', 'B', 'C') 
GROUP BY l.IdUser 
HAVING COUNT(DISTINCT le.IdEquipment) = 3 
+0

धन्यवाद, लेकिन, यह उन उपकरणों को वापस नहीं करेगा जो 3 उपकरणों वाले हैं, कभी भी यह नहीं मानें कि उनमें से एक "ए", "बी", "सी" है?उदाहरण के लिए, किसी को "ए" "एफ" और "टी" को संभालने की अनुमति है। वह व्यक्ति परिणाम में होगा, लेकिन मैं उन लोगों को चाहता हूं जो "ए" "बी" "सी" को संभाल सकें। अगर वे अधिक सामान भी संभाल सकते हैं ठीक है, लेकिन वे फ़िल्टर में शामिल सभी को संभालने में सक्षम होना चाहिए, न कि उनमें से केवल एक ... – Hobbes

+0

ठीक है, भूल जाओ, मेरे पास अभी तक मेरी सुबह कॉफी नहीं है, lol। आपका बहुत बहुत धन्यवाद! – Hobbes

0
SELECT l.IdUser 
FROM Licenses l 
INNER JOIN LicensesEquipments le ON le.IdLicense = l.IdLicense 
WHERE le.IdEquipment in (`enter code here`'A', 'B', 'C') 
GROUP BY l.IdUser 
HAVING COUNT(DISTINCT le.IdEquipment) = 3 
संबंधित मुद्दे