Đếm số lần xuất hiện của các giá trị DISTINCT


218

Tôi đang cố gắng tìm một truy vấn MySQL sẽ tìm thấy các giá trị DISTINCT trong một trường cụ thể, đếm số lần xuất hiện của giá trị đó và sau đó sắp xếp các kết quả theo số đếm.

ví dụ db

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

kết quả mong đợi

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

Câu trả lời:


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

2
Chính xác thì nhóm đang làm gì ở đây? Không rõ mục đích là gì? Có vẻ như nó nên hoạt động với nó nếu bạn chỉ đọc nó đơn giản.
James

19
Trong khi truy vấn của Amber là câu trả lời chính xác cho câu hỏi, tôi muốn điều chỉnh nhận xét của cô ấy để tránh dẫn người mới đi lạc đường. Nếu bạn rời khỏi "nhóm theo" trong truy vấn MySQL, bạn không nhận được [Mike, 1], [Mike, 1], bạn sẽ nhận được một kết quả duy nhất sẽ là tên trên hàng FIRST được trả về và đếm số lượng hàng trong bảng, vì vậy trong trường hợp này [Đánh dấu, 7]. Count (), như một hàm tổng hợp hoạt động trên toàn bộ tập dữ liệu, tính tổng, đếm hoặc nối trường đã chỉ định xuống một hàng. Nhóm bằng cách chia tập dữ liệu thành các khối dựa trên các combo duy nhất của các trường được chỉ định
Avatar_Squadron

3
Một cái gì đó tôi đấu tranh với là loại bỏ kết quả không có bản sao. Bạn không thể ném count(*) > 1vào một wheremệnh đề vì đó là một hàm tổng hợp. Bạn cũng nhận được một thông báo rất không hữu ích: "Sử dụng chức năng nhóm không hợp lệ." Cách đúng là bí danh số đếm name,COUNT(*) as cntvà thêm mệnh đề có như vậy : HAVING count > 1.
Patrick M

4
@PatrickM Có, HAVINGdành cho các điều kiện nên được áp dụng sau khi tổng hợp, trong khi đó WHERElà cho các điều kiện nên được áp dụng trước nó. (Một cách nghĩ khác về điều này là WHEREáp dụng cho dữ liệu hàng gốc; HAVINGáp dụng cho dữ liệu hàng đầu ra.)
Amber

2
Có một cái gì đó rất thỏa mãn về một câu lệnh SQL được xây dựng tốt.
Joshua Pinter

14

Điều gì về một cái gì đó như thế này:

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

Bạn đang chọn tên và số lần nó xuất hiện, nhưng nhóm theo tên để mỗi tên chỉ được chọn một lần.

Cuối cùng, bạn đặt hàng theo số lần theo thứ tự DESCending, để có người dùng xuất hiện thường xuyên nhất đến trước.


Truy vấn của bạn đã giúp tôi. Nó trả về một vài hàng như là kết quả. Tôi cũng muốn biết làm thế nào để tìm ra kết quả này. Đã thử một vài truy vấn nhưng dường như không thể đếm được tổng hợp. Bạn có thể giúp với điều đó?
Nav

@Nav - đếm những gì? Số lượng hàng trả về? Đó là SELECT COUNT(DISTINCT name) as count FROM your_tableđối với tổng số hàng của bảng, hãy thực hiện truy vấn của Pascal mà không cần group bycâu lệnh.
Mùa thu Leonard

Thật là một sự khác biệt một phút làm cho!
Chuck Le Mông

6

Chỉ cần thay đổi COUNT (*) của Amber thành COUNT (1) để có hiệu suất tốt hơn.

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

1
Thật ra những gì bạn nói là một phần ở đây
James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.