SQL Group By con un Order By


122

Ho una tabella di tag e desidero ottenere il numero più alto di tag dall'elenco.

I dati di esempio hanno questo aspetto

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

utilizzando

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

mi riporta perfettamente i dati che cerco. Tuttavia, vorrei organizzarlo, in modo che il numero di tag più alto sia il primo e limitarlo a inviarmi solo i primi 20 o giù di lì.

Ho provato questo ...

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

e continuo a ricevere il messaggio "Uso non valido della funzione di gruppo - ErrNr 1111"

Che cosa sto facendo di sbagliato?

Sto usando MySQL 4.1.25-Debian

Risposte:


199

In tutte le versioni di MySQL, è sufficiente creare un alias dell'aggregato nell'elenco SELECT e ordinare in base all'alias:

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

9
IMHO, questa è la versione più pulita della risposta selezionata. È immediatamente chiaro da cosa viene ordinato. Ovviamente, se è un copione veloce, non ha molta importanza.
JustAPoring

1
Sebbene OP utilizzi MySQL, questa risposta ha funzionato anche per me in HSQL (Libreoffice built-in)
Arno Teigseth

53

MySQL prima della versione 5 non consentiva funzioni aggregate nelle clausole ORDER BY.

Puoi aggirare questo limite con la sintassi deprecata:

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

1, poiché è la prima colonna su cui vuoi raggruppare.


8

Non so MySQL, ma in MS SQL, puoi usare l'indice di colonna nella order byclausola. L'ho già fatto in passato quando contavo con group bys poiché tende ad essere più facile lavorarci.

Così

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

diventa

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

6

In Oracle, qualcosa di simile funziona bene per separare un po 'meglio il conteggio e l'ordine. Non sono sicuro che funzionerà in MySql 4.

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

Sembra funzionare per me in 10.1.14-MariaDB (compatibile con MySQL). Pensavo di doverlo avere ) as counts, ma ha funzionato ancora senza la asparte.
Harry Pehkonen

3

Puoi aggirare questo limite con la sintassi deprecata: ORDER BY 1 DESC

Questa sintassi non è affatto deprecata, è E121-03 di SQL99.


5
Questo dovrebbe essere un commento invece di una risposta.
Rafael Barros

0

Prova questa domanda

 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

Cosa c'entra questo con la domanda? I campi non sono nemmeno gli stessi.
Blakes Seven
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.