Raggruppa SQL per con un ordine per
-
09-06-2019 - |
Domanda
Ho una tabella di tag e desidero ottenere il numero massimo di tag dall'elenco.
I dati di esempio appaiono così
id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')
utilizzando
SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`
mi restituisce perfettamente i dati che cerco.Tuttavia, vorrei organizzarlo in modo che i conteggi di tag più alti siano i primi e limitarlo a inviarmi 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 il messaggio "Uso non valido della funzione di gruppo - ErrNr 1111"
Che cosa sto facendo di sbagliato?
Sto usando MySQL 4.1.25-Debian
Soluzione
In tutte le versioni di MySQL, è sufficiente creare un alias per l'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
Altri suggerimenti
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.
Non conosco MySQL, ma in MS SQL puoi utilizzare l'indice della colonna nel file order by
clausola.L'ho già fatto prima quando il fare conta group by
È così che 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
In Oracle, qualcosa di simile funziona bene per separare un po' meglio il conteggio e l'ordinamento.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
Puoi aggirare questo limite con la sintassi deprecata:ORDINA PER 1 DESC
Questa sintassi non è affatto deprecata, è E121-03 da SQL99.
Prova questa query
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