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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top