DISTINCT मानों की घटनाओं की गणना करें


218

मैं एक MySQL क्वेरी खोजने की कोशिश कर रहा हूं जो किसी विशेष क्षेत्र में DISTINCT मान प्राप्त करेगा, उस मूल्य की घटनाओं की संख्या की गणना करेगा और फिर गणना द्वारा परिणाम का आदेश देगा।

उदाहरण db

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

अपेक्षित परिणाम

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

जवाबों:


396
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
वास्तव में यहाँ क्या कर समूह है? यह स्पष्ट नहीं है कि उद्देश्य क्या है? ऐसा लगता है कि इसे बाहर काम करना चाहिए यदि आप इसे सीधे तौर पर पढ़ते हैं।
जेम्स

19
जबकि एम्बर की क्वेरी प्रश्न का सही उत्तर है, मैं अग्रणी नए लोगों को भटकने से बचाने के लिए उनकी टिप्पणी पर एक सुधार करना चाहूंगा। यदि आप MySQL क्वेरी में "ग्रुप बाय" छोड़ते हैं, तो आपको [माइक, 1], [माइक, 1] नहीं मिलता है, आपको एक ही परिणाम मिलता है, जो एफआईआरएसटी पंक्ति में नाम होगा, और एक गिनती तालिका में पंक्तियों की संख्या, इसलिए इस मामले में [मार्क, 7]। गणना (), एक समग्र कार्य के रूप में, संपूर्ण डेटासेट पर, एक पंक्ति में नीचे निर्दिष्ट क्षेत्र को समेटने, गिनने या संक्षिप्त करने पर कार्य करता है। निर्दिष्ट क्षेत्रों के अनूठे कॉम्बो के आधार पर डेटासेट को समूह विखंडू में विभाजित करता है
अवतार_सक्वाड्रन

3
जिस चीज से मैं जूझ रहा था वह बिना किसी डुप्लिकेट के परिणाम को खत्म कर रही थी। आप count(*) > 1एक whereखंड में नहीं फेंक सकते क्योंकि यह एक समग्र कार्य है। आपको एक बहुत ही बेकार संदेश मिलता है: "समूह फ़ंक्शन का अमान्य उपयोग।" सही तरीके से उर्फ करने के लिए गिनती है name,COUNT(*) as cntऔर एक जोड़ने होने खंड इसलिए की तरह: HAVING count > 1
पैट्रिक एम

4
@PatrickM हाँ, HAVINGऐसी स्थितियों के लिए है जिन्हें एकत्रीकरण के बाद लागू किया जाना चाहिए, जबकि WHEREयह उन स्थितियों के लिए है जिन्हें इसके पहले लागू किया जाना चाहिए। (इसके बारे में सोचने का एक और तरीका यह है कि WHEREमूल पंक्ति डेटा HAVINGपर लागू होता है, आउटपुट पंक्ति डेटा पर लागू होता है।)
अंबर

2
एक अच्छी तरह से निर्मित SQL स्टेटमेंट के बारे में बहुत कुछ संतोषजनक है।
जोशुआ पिंटर

14

इस तरह के किसी चीज़ के बारे में क्या:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

आप नाम और प्रकट होने वाली संख्या का चयन कर रहे हैं, लेकिन नाम से समूहीकरण करना इसलिए प्रत्येक नाम केवल एक बार चुना जाता है।

अंत में, आप सबसे अधिक बार दिखने वाले उपयोगकर्ताओं को पहले आने के लिए, DESCending क्रम में कई बार ऑर्डर करते हैं।


आपकी क्वेरी ने मेरी मदद की। यह परिणामस्वरूप कुछ पंक्तियाँ लौटाता है। मैं यह भी जानना चाहता था कि इस परिणाम की गणना कैसे की जाए। कुछ प्रश्नों की कोशिश की, लेकिन यह एक कुल पर एक गिनती करने में सक्षम नहीं लगता है। क्या आप इसमें मदद कर सकते हैं?
नव

@Nav - क्या की एक गिनती? पंक्तियों की संख्या लौटी? यह SELECT COUNT(DISTINCT name) as count FROM your_tableतालिका की कुल पंक्तियों की गिनती के लिए, बिना group byकथन के पास्कल की क्वेरी करें ।
शरद लियोनार्ड

एक मिनट में क्या फर्क पड़ता है!
चक ले बट

6

बेहतर प्रदर्शन के लिए बस एम्बर के COUNT (*) को COUNT (1) में बदल दिया।

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

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