2011-08-18 10 views
5

मेरे पास डेटा का एक सेट है (उदाहरण के लिए, 'प्रोग्रामर' और 'भाषाएं'। प्रोग्रामर कई भाषाओं में कोड लिखते हैं, और कई भाषाओं द्वारा एक भाषा का उपयोग किया जा सकता है प्रोग्रामर)। यह डेटा एक टेबल प्रोग्रामर_भाषाओं में हैMYSQL कथन से जल्दी से समूह का चयन करने के लिए n: n तालिका

मैं प्रोग्रामर का चयन कैसे करूं जो सभी भाषाओं में कोड कोड करते हैं?

अधिक जानकारी अगर यह भ्रामक है:

सी ++, पास्कल, और रूबी में

जॉन कोड। सी ++ और रूबी में जो कोड। रूबी और पास्कल में मो कोड। सी ++ और पास्कल में स्टीव कोड।

यदि प्रश्न में भाषा का सेट सी ++ और पास्कल है, तो मैं इस सूची से जॉन और स्टीव चाहता हूं।

नोट करें कि इस सेट का आकार बहुत बड़ा हो सकता है, इसलिए मैं तालिका में खुद से बार में शामिल नहीं होना चाहता हूं।

+0

मुझे यकीन नहीं है कि मैं खुश हूं या उदास हूं कि यह प्रश्न, जो 'कॉलम = "foo" और कॉलम = "बार" के परिवार में है, इतने सारे गलत उत्तरों को पकड़ता है। – SingleNegationElimination

+0

क्या केवल एक टेबल है, या इस परिदृश्य में और अधिक टेबल हैं? और क्या यह केवल दो भाषा है, या यह एक परिवर्तनीय संख्या है जो आप फ़िल्टर कर सकते हैं? – Thorin

+0

एक टेबल, और भाषाओं की परिवर्तनीय संख्या। लेकिन यह स्वीकार्य होगा अगर यह केवल 4 या कम भाषाओं को संभाला जाता है। –

उत्तर

4

नोट इस सेट के आकार बहुत बड़ी प्राप्त कर सकते हैं, तो मैं करने के लिए तालिका में शामिल होने के लिए नहीं करना चाहते खुद एन बार।

किसी भी तरह से आप इसे हिलाते हैं, प्रत्येक भाषा के लिए शामिल होने जा रहा है। आप एक मूल्य (प्रोग्रामर) की तलाश में हैं जिसके लिए प्रत्येक मूल्य (भाषा) के लिए कम से कम एक पंक्ति मौजूद है। इसका मतलब है कि आपको उसी तालिका के एन विभिन्न दृष्टिकोणों के बारे में सोचना होगा।

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

SELECT programmer 
FROM (SELECT DISTINCT programmer, language 
     FROM speaks_table 
     WHERE language in ('C++', 'python')) AS disjunction 
GROUP BY disjunction.programmer 
HAVING count(disjunction.language) = 2 

लेकिन मौसम इस एक नियमित ol से बेहतर साबित 'बहुमार्गीय शामिल होने पर निर्भर करने के लिए जा रहा है प्रश्न में सही डेटा। प्रश्न में भाषाओं की संख्या के आधार पर कम से कम जेनरेटिव प्रश्नों की आवश्यकता नहीं है।

+0

+1 यह इंगित करने के लिए कि अधिकांश समय संभवतः अधिक कुशल होते हैं। यह सुनना दिलचस्प होगा कि डेटा का सेट वास्तव में कितना बड़ा है, हालांकि। – Thorin

+0

डेटा लगभग 550,000 पंक्तियां है, जहां ~ 6000 "प्रोग्रामर" और ~ 1800 "भाषाएं हैं"। प्रदर्शन एक मुद्दा है, क्योंकि इस डीबी को एक बार में मारने वाले 50ish लोग होंगे (यह क्वेरी कम से कम उपयोग की जाती है, लेकिन मैं इसे 20 सेकंड के लिए डेटाबेस लॉक नहीं कर सकता)। –

+0

यह एक अच्छा जवाब है ... बस निराशाजनक। मुझे आश्चर्य है कि प्रोग्रामर द्वारा डेटा समूह करने का कोई प्रभावी तरीका नहीं है, और फिर प्रत्येक प्रोग्रामर को एन भाषाओं के सेट की जांच करने के लिए देखें। डेटा के आकार के साथ, 4x आत्म-जुड़वां पागल हो जाएगा। –

-1

संपादित करें: यह मेरा पहला जवाब था और सवाल के लिए काम नहीं करता है।

SELECT DISTINCT Programmer 
FROM Programmers_Languages 
WHERE Language IN ('C++', 'Pascal') 
ORDER BY Programmer 

DISTINCT ताकि आप केवल एक बार प्रत्येक परिणाम प्राप्त:

तालिका Programmers_Languages मान लिया जाये कि दो VARCHAR कॉलम, एक बुलाया Programmer और अन्य Languages कहा जाता है। ORDER BY यदि आप इसे वर्णानुक्रम में क्रमबद्ध करना चाहते हैं।


संपादित: अलग क्वेरी, इस काम करता है।

SELECT Programmers 
FROM Programmers_Languages 
WHERE Languages IN ('C++', 'Pascal') 
GROUP BY Programmers 
HAVING COUNT(*) >= 2 
ORDER BY Programmers 

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

SELECT DISTINCT Programmers 
FROM Programmers_Languages 
WHERE Languages = 'C++' 
AND Languages = 'Pascal' 
AND <...> 
ORDER BY Programmers 
+0

नहीं। यह प्रोग्रामर का चयन करता है जो कम से कम उन भाषाओं में से एक बोलते हैं, लेकिन कोरीकेंडल ने एक क्वेरी के लिए कहा जो केवल उन प्रोग्रामर का उत्पादन करता है जो उन सभी को बोलते हैं। – SingleNegationElimination

+0

यह काम नहीं करता है - उसे उन सभी लोगों की एक सूची की आवश्यकता है जो सभी वस्तुओं से मेल खाते हैं, न केवल 1. –

+0

उत्कृष्ट बिंदु, दोस्तों, मेरी थके हुए आंखें "और" को "या" के रूप में गलत तरीके से पढ़ती हैं। इसके अलावा, @corykendall, उत्कृष्ट सवाल! – Thorin

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