2009-07-20 17 views
5

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

बोनस अंक - वैकल्पिक सेनारियो दिया गया, जहां यह कई जोड़ों के लिए बहुत कुछ है, एसक्यूएल अप्रयुक्त समूहों की पहचान करने के लिए क्या है?

(यदि आप ठोस फ़ील्ड नाम :) एक-से-अनेक हैं:

Table 'users': | user_id | group_id | 
Table 'groups': | group_id | 

कई-से-अनेक:

Table 'users': | user_id | 
Table 'groups': | group_id | 
Table 'user-group': | user_id | group_id | 
+0

दोनों उत्तरों के लिए धन्यवाद, वे दोनों काम करते हैं। यदि मैं दो तरीकों के बीच कोई कार्यात्मक अंतर है तो मैं उत्सुक हूं। – dimo414

+0

@ dimo414 - कम से कम एसक्यूएल सर्वर (2005) में, मेरे संस्करण के लिए निष्पादन योजना कम है और इसमें * मामूली * कम लागत है। असल में, जब तक आप बड़े डेटासेट का उपयोग नहीं कर लेते हैं, तब तक यह उतना ही नीचे होगा जितना आप अधिक पठनीय मानते हैं! =) – Rob

+0

हालांकि - उपयोगकर्ताओं_ग्रुप में 65,536 पंक्तियों के साथ एक ही बैच में दोनों प्रश्नों को चलाने के बाद, मेरी क्वेरी बैच लागत का 1% और बैदर के 99% के रूप में अन्य में आती है - दोनों अभी भी एक से कम में निष्पादित हैं कुल मिलाकर दूसरा – Rob

उत्तर

4

समूह में कोई सदस्य नहीं (अनेक-अनेक जोड़ियों के लिए) है:

SELECT * 
FROM groups g 
WHERE NOT EXISTS 
    (
     SELECT 1 
     FROM users_groups ug 
     WHERE g.groupid = ug.groupid 
    ); 

यह Sql भी अपने "पहली" उदाहरण में काम के रूप में आप "users_groups" के लिए "उन" स्थानापन्न कर सकते हैं उप क्वेरी =)

जहाँ तक .. के रूप में प्रदर्शन का सवाल है, मुझे पता है कि इस क्वेरी SQL सर्वर पर काफी performant हो सकता है, लेकिन मैं इतना यकीन है कि कैसे अच्छी तरह MySql यह पसंद करती है नहीं कर रहा हूँ

2

पहले एक के लिए, इस प्रयास करें:

SELECT * FROM groups 
LEFT JOIN users ON (groups.group_id=users.group_id) 
WHERE users.user_id IS NULL; 

दूसरे के लिए, इसे आजमाएं:

SELECT * FROM groups 
LEFT JOIN user-group ON (groups.group_id=user-group.group_id) 
WHERE user-group.user_id IS NULL; 
1
SELECT * 
FROM groups 
WHERE groups.id NOT IN (
    SELECT user.group_id 
    FROM user 
) 

यह फिर से शुरू होगा n सभी समूह आईडी जो उपयोगकर्ता में मौजूद नहीं हैं

संबंधित मुद्दे

 संबंधित मुद्दे