Sıralama Ölçütüyle SQL Gruplama Ölçütü


122

Bir etiket tablom var ve listeden en yüksek sayı etiketlerini almak istiyorum.

Örnek veriler şuna benzer

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

kullanma

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

aradığım verileri mükemmel bir şekilde geri getiriyor. Bununla birlikte, en yüksek etiket sayıları önce olacak ve bunu bana yalnızca ilk 20'yi gönderecek şekilde düzenlemek istiyorum.

Bunu denedim ...

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

ve "Grup işlevinin geçersiz kullanımı - ErrNr 1111" alıyorum

Neyi yanlış yapıyorum?

MySQL 4.1.25-Debian kullanıyorum

Yanıtlar:


199

MySQL'in tüm sürümlerinde, yalnızca SELECT listesindeki toplamın adını yazın ve takma ada göre sıralayın:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20

9
IMHO, bu seçilen cevaptan daha temiz bir versiyon. Neyin sipariş ettiği anında anlaşılır. Elbette, hızlı bir senaryo ise, bu gerçekten önemli değil.
JustAPoring

1
OP MySQL kullanıyor olsa da, bu cevap benim için HSQL'de de (yerleşik Libreoffice) çalıştı
Arno Teigseth

53

Sürüm 5'ten önceki MySQL, ORDER BY cümlelerinde toplama işlevlerine izin vermiyordu.

Kullanımdan kaldırılan sözdizimi ile bu sınırı aşabilirsiniz:

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20

1, üzerinde gruplamak istediğiniz ilk sütun olduğu için.


8

MySQL hakkında bir bilgim yok, ancak MS SQL'de, order bycümlede sütun indeksini kullanabilirsiniz . Bunu daha önce group bys ile sayarken yaptım çünkü çalışmak daha kolay oluyor.

Yani

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

Oluyor

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20

6

Oracle'da bunun gibi bir şey, sayımınızı ve sıralamanızı biraz daha iyi ayırmak için güzel çalışıyor. MySql 4'te çalışıp çalışmayacağından emin değilim.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

Benim için 10.1.14-MariaDB'de (MySQL uyumlu) çalışıyor gibi görünüyor. Yapmam gerektiğini düşündüm ) as countsama yine de asparça olmadan çalıştı .
Harry Pehkonen

3

Kullanımdan kaldırılan sözdizimi ile bu sınırı aşabilirsiniz: ORDER BY 1 DESC

Bu sözdizimi hiç kullanımdan kaldırılmamıştır, SQL99'dan E121-03'tür.


5
Bu bir cevap yerine bir yorum olmalıdır.
Rafael Barros

0

Bu sorguyu dene

 SELECT  data_collector_id , count (data_collector_id ) as frequency 
    from rent_flats 
    where is_contact_person_landlord = 'True' 
    GROUP BY data_collector_id 
    ORDER BY count(data_collector_id) DESC

Bunun soruyla ne alakası var? Alanlar aynı bile değil.
Blakes Seven
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.