นับการเกิดขึ้นของค่า 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
กลุ่มทำอะไรที่นี่อย่างแน่นอน? ไม่ชัดเจนว่าจุดประสงค์คืออะไร? ดูเหมือนว่าควรจะทำงานโดยไม่ได้ตั้งใจหากคุณเพียงแค่อ่านอย่างชัดเจน
James

19
ในขณะที่การสืบค้นของแอมเบอร์เป็นคำตอบที่ถูกต้องสำหรับคำถาม แต่ฉันต้องการแก้ไขความคิดเห็นของเธอเพื่อหลีกเลี่ยงการนำคนใหม่มาหลงทาง หากคุณออกจาก "กลุ่มโดย" ในแบบสอบถาม MySQL คุณจะไม่ได้รับ [Mike, 1], [Mike, 1] คุณจะได้รับผลลัพธ์เดียวซึ่งจะเป็นชื่อในแถว FIRST ที่ส่งคืนและการนับ จำนวนแถวในตารางดังนั้นในกรณีนี้ [Mark, 7] count () เนื่องจากฟังก์ชันการรวมทำงานบนชุดข้อมูลทั้งหมดการรวมการนับหรือการรวมเขตข้อมูลที่ระบุลงไปหนึ่งแถว จัดกลุ่มตามชุดข้อมูลย่อยเป็นชุดข้อมูลตามคอมโบที่ไม่ซ้ำกันของฟิลด์ที่ระบุ
Avatar_Squadron

3
สิ่งที่ฉันต่อสู้คือการกำจัดผลลัพธ์โดยไม่ซ้ำซ้อน คุณไม่สามารถส่งคำสั่งcount(*) > 1เป็นwhereประโยคเพราะมันเป็นฟังก์ชั่นรวม คุณจะได้รับข้อความที่ไม่ช่วยเหลือมากเช่น: "การใช้ฟังก์ชั่นกลุ่มไม่ถูกต้อง" วิธีที่ถูกต้องคือการนามแฝงนับname,COUNT(*) as cntและเพิ่มข้อต้องHAVING count > 1ชอบโดย:
Patrick M

4
@PatrickM ใช่HAVINGมีไว้สำหรับเงื่อนไขที่ควรนำไปใช้หลังการรวมในขณะที่WHEREสำหรับเงื่อนไขที่ควรนำมาใช้ก่อนหน้านี้ (วิธีคิดอีกวิธีหนึ่งคือWHEREใช้กับข้อมูลแถวดั้งเดิมHAVINGนำไปใช้กับข้อมูลแถวเอาท์พุท)
เหลืองอำพัน

2
มีบางอย่างที่น่าพอใจมากเกี่ยวกับคำสั่ง SQL ที่สร้างขึ้นอย่างดี
Joshua Pinter

14

อะไรประมาณนี้

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

คุณกำลังเลือกชื่อและจำนวนครั้งที่จะปรากฏ แต่การจัดกลุ่มตามชื่อดังนั้นแต่ละชื่อจะถูกเลือกเพียงครั้งเดียว

สุดท้ายคุณสั่งซื้อตามจำนวนครั้งในลำดับ DESCending เพื่อให้ผู้ใช้ที่ปรากฏบ่อยที่สุดมาก่อน


คำถามของคุณช่วยฉัน มันจะส่งคืนผลลัพธ์สองสามแถว ฉันต้องการทราบวิธีค้นหาจำนวนผลลัพธ์นี้ด้วย พยายามสืบค้นคำถามสองสามข้อ แต่ดูเหมือนว่าจะไม่สามารถนับรวมได้ คุณช่วยได้ไหม
Nav

@Nav - นับจากอะไร จำนวนแถวกลับมา? นั่นคือSELECT COUNT(DISTINCT name) as count FROM your_tableเพื่อนับจำนวนแถวทั้งหมดของตารางให้ทำแบบสอบถามของ Pascal โดยไม่มีgroup byข้อความ
ฤดูใบไม้ร่วง Leonard

สิ่งที่แตกต่างนาทีทำให้!
Chuck Le Butt

6

เพิ่งเปลี่ยน COUNT ของแอมเบอร์ (*) เป็น COUNT (1) เพื่อประสิทธิภาพที่ดีขึ้น

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

1
จริงๆแล้วสิ่งที่คุณพูดนั้นเป็นบางส่วนที่นี่
James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.