चुनें कि एक क्षेत्र की गिनती एक से अधिक कहां है


100

मैं कुछ इस तरह करना चाहता हूं:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

मैं इसे MySql में कैसे प्राप्त कर सकता हूं?

जवाबों:


146

कुल परिणाम की तुलना के लिए, खंड का उपयोग HAVINGन करें WHERE

क्वेरी को अंकित मूल्य पर लेना:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

आदर्श रूप से, खंड GROUP BYमें उचित मूल्यांकन के लिए परिभाषित होना चाहिए HAVING, लेकिन MySQL ग्रुप BY से छिपे हुए कॉलम की अनुमति देता है ...

इस पर एक अद्वितीय बाधा के लिए तैयारी में है someField? ऐसा लगता है कि यह होना चाहिए ...


11
एक GROUP BYनिश्चित रूप से आवश्यकता है (जब तक कि यह कुछ MySQL नॉन स्टैंडर्ड बात नहीं है)?
मार्टिन स्मिथ

@ मर्टिन स्मिथ: क्वेरी को अंकित मूल्य पर लिया; एड्रेस बाय बाय इशू (गुप्त छिपा कॉलम सुविधा)।
OMG पॉनीज

"लगता है ऐसा होना चाहिए ..." क्यों? मुझे इस पर शिक्षा की आवश्यकता है :)
डेव

यदि यह 2 से अधिक गैर शून्य someFieldमान या खाली परिणाम सेट करता है तो यह पूरी तालिका को वापस कर देगा ।
मार्टिन स्मिथ

@ क्या: यदि आप ऐसी स्थिति में थे, जहाँ आपको समय-समय पर खराब डेटा की जाँच और सुधार करना होता था, तो क्या आप स्थिति को पहले स्थान पर होने से रोकना नहीं चाहेंगे? MySQL इंडेक्स के रूप में एक अद्वितीय अवरोध को लागू करता है - अधिक जानकारी के लिए CREATE INDEX प्रलेखन देखें
OMG Ponies

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
यहां केवल एक ही चेतावनी है (कम से कम 5.1.46-समुदाय MySQL सामुदायिक सर्वर (GPL)) यह है कि "प्रत्येक व्युत्पन्न तालिका का अपना उपनाम होना चाहिए", जो आपको sql बना देगा जैसे: उपयोगकर्ता नाम चुनें, से नाम सुन्न करें (उपयोगकर्ता नाम चुनें) गणना (उपयोगकर्ता नाम) ग्राहकों से सुमेल के रूप में ग्रुप द्वारा उपयोगकर्ता नाम) my_table के रूप में कहाँ सुन्न> 3
D_K

14

आप इसे स्वयं से जुड़ने के लिए भी कर सकते हैं:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk



1

जैसा कि ओएमजी पोनीज़ ने कहा, आप के बाद होने वाले क्लॉज़ हैं। हालाँकि, अगर आप उम्मीद कर रहे थे कि आपको सारांश के बजाय असतत पंक्तियाँ मिलेंगी ("होने" से सारांश बनता है) - यह एक कथन में नहीं किया जा सकता है। आपको उस स्थिति में दो कथनों का उपयोग करना चाहिए।


1
पूरी तरह से सच नहीं है - HAVING का उपयोग करने के लिए हेरफेर करने के लिए GROUP BY का उपयोग करें।
OMG पॉनीज

1

मैं Sql में दो तालिका के बीच समूह द्वारा एक उदाहरण देता हूं:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

मेरे लिए, सिर्फ खाली परिणाम देकर समूह नहीं बनाना। इसलिए मुझे लगता है कि होने वाले बयान के लिए एक समूह होना बहुत महत्वपूर्ण है


-2

यह भी उल्लेख किया जाना चाहिए कि "पीके" एक प्रमुख क्षेत्र होना चाहिए। आत्म-जुड़ना

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

बिल करविन द्वारा आपको सारे रिकॉर्ड दिए गए हैं जो डुप्लिकेट हैं जो मुझे चाहिए थे। क्योंकि कुछ में दो से अधिक है, आप एक ही रिकॉर्ड एक से अधिक बार प्राप्त कर सकते हैं। मैंने मुख्य फ़ील्ड्स दमन द्वारा समान रिकॉर्ड से छुटकारा पाने के लिए समान फ़ील्ड्स के साथ सभी अन्य तालिका में लिखा था। मैंने कोशिश की

SELECT * FROM db.table HAVING COUNT(someField) > 1

पहले ऊपर। इससे लौटाए गए डेटा डुप्लिकेट में से केवल एक ही देते हैं, इससे कम 1/2 जो आपको देता है लेकिन अगर आप चाहते हैं तो गिनती अच्छी है।


3
यह वास्तव में एक जवाब नहीं है।
आनन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.