Hitung kemunculan nilai DISTINCT


218

Saya mencoba menemukan kueri MySQL yang akan menemukan nilai DISTINCT dalam bidang tertentu, menghitung jumlah kemunculan nilai itu dan kemudian memesan hasilnya berdasarkan hitungan.

contoh db

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

Hasil yang diharapkan

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

Jawaban:


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

2
Apa yang sebenarnya dilakukan grup di sini? Tidak jelas apa tujuannya? Sepertinya itu akan berhasil tanpa itu jika Anda hanya membaca di mana saja.
James

19
Sementara pertanyaan Amber adalah jawaban yang benar untuk pertanyaan itu, saya ingin membuat koreksi atas komentarnya untuk menghindari kesalahan orang-orang baru. Jika Anda meninggalkan "grup dengan" dalam kueri MySQL, Anda tidak mendapatkan [Mike, 1], [Mike, 1], Anda mendapatkan hasil tunggal yang akan menjadi nama pada baris PERTAMA yang dikembalikan, dan hitungan jumlah baris dalam tabel, jadi dalam hal ini [Mark, 7]. count (), karena fungsi agregat bekerja pada seluruh dataset, menjumlahkan, menghitung, atau menyatukan bidang yang ditentukan hingga satu baris. Kelompokkan dengan membagi dataset menjadi potongan-potongan berdasarkan kombo unik dari bidang yang ditentukan
Avatar_Squadron

3
Sesuatu yang saya perjuangkan menghilangkan hasil tanpa duplikat. Anda tidak dapat count(*) > 1memasukkan whereklausa karena ini merupakan fungsi agregat. Anda juga mendapatkan pesan yang sangat tidak membantu: "Penggunaan fungsi grup tidak valid." Cara yang benar adalah dengan alias hitungan name,COUNT(*) as cntdan menambahkan memiliki klausul seperti: HAVING count > 1.
Patrick M

4
@ Patrickrick Ya, HAVINGuntuk kondisi yang harus diterapkan setelah agregasi, sedangkan WHEREuntuk kondisi yang harus diterapkan sebelumnya. (Cara lain untuk berpikir tentang ini adalah yang WHEREberlaku untuk data baris asli; HAVINGberlaku untuk data baris output.)
Amber

2
Ada sesuatu yang sangat memuaskan tentang pernyataan SQL yang dibangun dengan baik.
Joshua Pinter

14

Bagaimana dengan sesuatu yang seperti ini:

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

Anda memilih nama dan berapa kali itu muncul, tetapi pengelompokan berdasarkan nama sehingga setiap nama hanya dipilih sekali.

Akhirnya, Anda memesan berdasarkan berapa kali dalam urutan DESCending, untuk membuat pengguna yang paling sering muncul lebih dulu.


Permintaan Anda membantu saya. Ini mengembalikan beberapa baris sebagai hasilnya. Saya juga ingin tahu bagaimana menemukan hitungan hasil ini. Sudah mencoba beberapa pertanyaan tetapi sepertinya tidak bisa melakukan penghitungan secara agregat. Bisakah Anda membantu dengan itu?
Nav

@Nav - hitungan apa? Jumlah baris yang dikembalikan? Bahwa ini SELECT COUNT(DISTINCT name) as count FROM your_tableUntuk hitungan total baris tabel, melakukan query Pascal tanpa group bypernyataan.
Autumn Leonard

Apa bedanya satu menit!
Chuck Le Butt

6

Baru saja mengubah COUNT (*) Amber menjadi COUNT (1) untuk kinerja yang lebih baik.

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

1
Sebenarnya apa yang Anda katakan sebagian di sini
James
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.