DISTINCT değerlerinin oluşumlarını sayın


218

Belirli bir alanda DISTINCT değerleri bulan, bu değerin oluşum sayısını saymak ve sonra sayıya göre sonuçları sipariş bir MySQL sorgusu bulmaya çalışıyorum.

örnek db

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

Beklenen Sonuç

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

Yanıtlar:


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

2
Grup burada tam olarak ne yapıyor? Amacın ne olduğu belli değil mi? Eğer sadece açık bir şekilde okursanız, onunla çalışmak gerekir gibi görünüyor.
James

19
Amber'in sorusu soru için doğru cevap olsa da, yeni insanlara sapmayı önlemek için yorumunda bir düzeltme yapmak istiyorum. Bir MySQL sorgusunda "gruplama ölçütü" nü bırakırsanız, [Mike, 1], [Mike, 1] ifadesini alamazsınız, döndürülen İLK satırındaki ad ve bir sayı olacak tek bir sonuç alırsınız tablodaki satır sayısını gösterir, bu durumda [Mark, 7]. count (), bir toplama işlevi tüm veri kümesinde çalışır, belirtilen alanı tek bir satıra kadar toplama, sayma veya sonlandırma. Grupla, veri kümesini belirtilen alanların benzersiz kombinasyonlarına göre parçalar halinde alt gruplara
ayırır

3
Mücadele ettiğim bir şey, kopyaları olmayan sonuçları ortadan kaldırmaktı. Bir atamaz count(*) > 1bir içine wherebir toplama işlevlerini çünkü maddesi. Ayrıca çok yardımcı olmayan bir ileti alırsınız: "Grup işlevinin geçersiz kullanımı." Doğru yol takma adına sayısıdır name,COUNT(*) as cntve bir ekleme sahip maddesini şöyle: HAVING count > 1.
Patrick M

4
@PatrickM Evet, toplamadan HAVINGsonra uygulanması gereken durumlar WHEREiçin , ondan önce uygulanması gereken koşullar içindir. (Bunu düşünmenin başka bir yolu WHEREda orijinal satır verileri için HAVINGgeçerlidir ; çıkış satırı verileri için geçerlidir.)
Amber

2
İyi yapılandırılmış bir SQL deyimi hakkında çok tatmin edici bir şey var.
Joshua Pinter

14

Böyle bir şeye ne dersin:

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

Adı ve görüntülenme sayısını seçiyorsunuz, ancak her bir adın yalnızca bir kez seçilmesi için ada göre gruplandırıyorsunuz.

Son olarak, en sık görünen kullanıcıların önce gelmesi için DESCending sırasına göre sipariş verin.


Sorgunuz bana yardımcı oldu. Sonuç olarak birkaç satır döndürür. Ayrıca bu sonucun sayısını nasıl bulacağımı bilmek istedim. Birkaç sorgu denedim, ancak toplamda bir sayı yapamayacak gibi görünüyor. Bu konuda yardımcı olabilir misiniz?
Nav

@Nav - ne sayısı? Döndürülen satır sayısı? Yıllardan bu SELECT COUNT(DISTINCT name) as count FROM your_tabletablonun toplam satır sayısı için, olmadan Pascal sorgusunu yapmak group byaçıklamada.
Sonbahar Leonard

Bir dakika ne fark eder!
Chuck Le Butt

6

Daha iyi performans için Amber'in COUNT (*) değerini COUNT (1) olarak değiştirdim.

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

1
Aslında söyledikleriniz burada
James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.