SQL Group By dengan Order By

122

Saya memiliki tabel tag dan ingin mendapatkan jumlah tag tertinggi dari daftar.

Contoh data terlihat seperti ini

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

menggunakan

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

mengembalikan data yang saya cari dengan sempurna. Namun, saya ingin mengaturnya, sehingga jumlah tag tertinggi adalah yang pertama, dan membatasinya agar hanya mengirim saya 20 tag pertama atau lebih.

Saya mencoba ini ...

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

dan saya terus mendapatkan "Penggunaan fungsi grup yang tidak valid - ErrNr 1111"

Apa yang saya lakukan salah?

Saya menggunakan MySQL 4.1.25-Debian

maxsilver.dll
sumber

Jawaban:

199

Di semua versi MySQL, cukup buat alias agregat di daftar SELECT, dan urutkan berdasarkan alias:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
Scott Noyes
sumber
9
IMHO, ini adalah versi yang lebih bersih dari jawaban yang dipilih. Langsung jelas apa yang dipesan oleh. Tentu saja, jika itu skrip cepat, itu tidak terlalu penting.
JustAPoring
1
Meskipun OP menggunakan MySQL, jawaban ini juga berfungsi untuk saya di HSQL (Libreoffice built-in)
Arno Teigseth
53

MySQL sebelum versi 5 tidak mengizinkan fungsi agregat dalam klausa ORDER BY.

Anda dapat mengatasi batas ini dengan sintaks yang tidak digunakan lagi:

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

1, karena ini adalah kolom pertama yang ingin Anda kelompokkan.

Lasse V. Karlsen
sumber
8

Saya tidak tahu tentang MySQL, tetapi di MS SQL, Anda dapat menggunakan indeks kolom di order byklausa. Saya telah melakukan ini sebelumnya ketika melakukan penghitungan dengan group bys karena cenderung lebih mudah untuk dikerjakan.

Begitu

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

Menjadi

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20
jerhinesmith.dll
sumber
6

Di Oracle, sesuatu seperti ini berfungsi dengan baik untuk memisahkan penghitungan dan urutan Anda sedikit lebih baik. Saya tidak yakin apakah ini akan berfungsi di MySql 4.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc
JosephStyons
sumber
Tampaknya berfungsi untuk saya di 10.1.14-MariaDB (kompatibel dengan MySQL). Saya pikir saya harus punya ) as counts, tetapi masih berfungsi tanpa asbagian.
Harry Pehkonen
3

Anda dapat mengatasi batas ini dengan sintaks yang tidak digunakan lagi: ORDER BY 1 DESC

Sintaks ini sama sekali tidak usang, ini E121-03 dari SQL99.

Damien B
sumber
5
Ini harus menjadi komentar, bukan jawaban.
Rafael Barros
0

Coba kueri ini

 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
Ashutosh Gupta
sumber
Apa hubungannya ini dengan pertanyaan? Lahannya bahkan tidak sama.
Blakes Seven