2012-05-18 15 views
7

में अलग करें यदि कोई मेरी SQL क्वेरी को सत्यापित कर सकता है तो मैं वास्तव में इसकी सराहना करता हूं।MySQL एक ही कॉलम में एक ही मान के साथ पंक्तियों का चयन करें और

निम्नलिखित डाटासेट के लिए:

MD5  UserPK  CategoryPK  
ADCDE 1   7 
ADCDE 1   4 
ADCDE 1   7 
dffrf 1   7 
dffrf 2   7 
dffrf 2   6 
dffrf 1   1 

मैं MD5 और CategoryPK जहां दो या अधिक पंक्तियों समान MD5 मूल्यों, समान CatgegoryPK और दो या अधिक विभिन्न UserPK मूल्यों के साथ मौजूद हैं का चयन करना चाहते हैं।

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

उपरोक्त डेटा से

तो, मैं तो बस लौटा दी चाहते हैं:

md5 CategoryPK 
dffrf 7 

क्वेरी मैं लिखा है है:

SELECT md5, 
     count(md5), 
     count(distinct categorypk) as cntcat, 
     count(distinct userpk) as cntpk 
FROM Hash 
     group by md5 having count(md5) > 1 
          and cntpk > 1 
          and cntcat = 1; 

यह काम करने के लिए लगता है, लेकिन उपयोग करने से पहले मैं शुरू यह क्रोध में, अगर मैं कुछ याद कर चुका हूं या ऐसा करने का एक बेहतर तरीका है तो मैं दूसरी राय की सराहना करता हूं।

धन्यवाद

+3

सवाल इस तरह की [कोड समीक्षा] (http://codereview.stackexchange.com) StackOverflow से के लिए अधिक उपयुक्त हो सकता है। दोनों सुझावों के लिए – eggyal

उत्तर

11

मुझे नहीं लगता कि अपने कोड आप दे देंगे क्या आप के बाद कर रहे हैं है, क्या होता है जब एक फ़ाइल को एकाधिक उपयोगकर्ताओं द्वारा एक से अधिक श्रेणियों को सौंपा गया है, कुछ श्रेणियों के ओवरलैपिंग के साथ? फिर cntcat != 1, इसलिए आपका HAVING खंड मिलान करने में विफल रहेगा, भले ही फ़ाइल को वास्तव में एकाधिक उपयोगकर्ताओं द्वारा समान रूप से वर्गीकृत किया गया हो।

मैं बजाय एक स्वयं में शामिल होने का प्रयोग करेंगे:

SELECT a.MD5, a.CategoryPK 
FROM  Hash a 
    JOIN Hash b 
     ON a.MD5 = b.MD5 
    AND a.UserPK <> b.UserPK 
    AND a.CategoryPK = b.CategoryPK 
GROUP BY a.MD5, a.CategoryPK 
HAVING COUNT(DISTINCT a.UserPK) > 2 -- you said "more than 2" ? 
+0

अच्छा बिंदु - मैंने अभी अपनी तालिकाओं में से एक पर जांच की है और मुझे इस क्वेरी का उपयोग करके 10 और फाइलें मिलीं! – user1395659

1

मैं क्या आप अलग लिखा है आप अपने चयन सूची में श्रेणी जो मापदंड में प्रतीत होता है नहीं मिल रहा है से के साथ कोई समस्या नहीं देख सकते हैं? मुझे लगता है कि आप इसे थोड़ा आसान बनाने और श्रेणी से बाहर हो सकता है: वैकल्पिक रूप से

SELECT MD5, CategoryPK 
FROM Hash 
GROUP BY MD5, CategoryPK 
HAVING MIN(UserPK) <> MAX(UserPK) 

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

SELECT DISTINCT t1.MDF, t2.CategoryPK 
FROM Hash T1 
     INNER JOIN Hash T2 
      ON T1.MD5 = T2.MD5 
      AND T1.CategoryPK = T2.CategoryPK 
      AND T1.UserPK < T2.UserPK 
+0

+1 (हालांकि यदि ओपी वास्तव में "* दो अलग-अलग उपयोगकर्ताओं * से अधिक है" जैसा कि उनके पाठ में वर्णित है, तो वे स्पष्ट रूप से वांछित परिणाम नहीं देंगे - लेकिन उनके प्रयास के आधार पर मैं सहमत हूं कि उनका शायद अर्थ है * कम से कम दो..*)। हालांकि, मुझे लगता है कि आपकी टिप्पणी है कि ओपी ने जो लिखा है उसके साथ कोई समस्या नहीं है: मेरे जवाब की शुरुआत में मेरा अवलोकन देखें। – eggyal

+0

हां - आप सही हैं, मेरा मतलब कम से कम दो था और मैंने सवाल को सही कर दिया है। – user1395659

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