2008-08-26 6 views
89

Ho una tabella di tag e voglio ottenere i tag di conteggio più alti dall'elenco.Gruppo SQL con un ordine da

dati di esempio si presenta così

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

utilizzando

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

mi viene di nuovo i dati che sto cercando perfettamente. Tuttavia, mi piacerebbe organizzarlo, in modo che i conteggi dei tag più alti siano i primi e limitati a mandarmi solo i primi 20 circa.

Ho provato questo ...

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

e continuo a ricevere un "uso non valido della funzione di gruppo - ErrNr 1111"

Che cosa sto facendo di sbagliato?

Sto usando MySQL 4.1.25-Debian

+0

Sì, assolutamente. Fatto. – maxsilver

risposta

164

In tutte le versioni di MySQL, semplicemente alias l'aggregato nell'elenco SELECT, e l'ordine per l'alias:

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

IMHO, questa è la versione più pulita della risposta selezionata. È immediatamente chiaro ciò che è ordinato da. Certo, se è uno script veloce, non importa. – JustAPoring

+1

Sebbene OP stia usando MySQL, questa risposta ha funzionato anche per me in HSQL (built-in Libreoffice) –

48

MySQL precedenti alla versione 5 non permetteva funzioni di aggregazione a clausole ORDER BY.

è possibile aggirare questo limite con la sintassi deprecato:

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

1, dal momento che è la prima colonna che si desidera gruppo su.

7

Non so MySQL, ma in MS SQL, è possibile utilizzare l'indice di colonna nella clausola order by. Ho fatto questo prima quando si fa conteggi con group by s in quanto tende ad essere più facile da lavorare.

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 
4

In Oracle, qualcosa di simile funziona bene separare il conteggio e l'ordinazione di un po 'meglio. Non sono sicuro se 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 
+0

Sembra funzionare per me in 10.1.14-MariaDB (compatibile con MySQL). Ho pensato che dovevo avere ') come conteggi', ma funzionava ancora senza la parte' as'. –

2

È possibile aggirare questo limite con la sintassi deprecato: ORDER BY 1 DESC

Questa sintassi non è deprecato a tutto, è E121-03 da SQL99.

+4

Questo dovrebbe essere un commento invece di una risposta. –

+7

Non si dovrebbe commentare una risposta di quasi sei anni :-) –

+3

Kkkk, abbastanza giusto. –

0

Prova questa ricerca

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 
+0

Cosa c'entra questo con la domanda? I campi non sono uguali. –