2008-08-26 13 views
89

que tiene una tabla de etiquetas y desea obtener las etiquetas de recuento más alto de la lista.SQL Grupo A con una Orden Por

Los datos de muestra se ve así

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

usando

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

me hace volver los datos que estoy buscando la perfección. Sin embargo, me gustaría organizarlo, de manera que los más altos etiqueta cuenta son primero, y limitarlo a Enviar sólo la primera 20 o así.

He intentado esto ...

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

y Me aparece un "Uso no válido de la función de grupo - ErrNr 1111"

¿qué estoy haciendo mal?

estoy usando MySQL 4.1.25-Debian

+0

Sí, absolutamente. Hecho. – maxsilver

Respuesta

164

En todas las versiones de MySQL, simplemente alias el agregado en la lista SELECT, y el orden con el alias:

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

En mi humilde opinión, esta es la versión más limpia que la respuesta seleccionada. Al instante está claro lo que está ordenado por. Por supuesto, si es un guión rápido, eso realmente no importa. – JustAPoring

+1

Aunque OP usa MySQL, esta respuesta también funcionó para mí en HSQL (Libreoffice built-in) –

48

MySQL anteriores a la versión 5 no permitió que las funciones de agregado en cláusulas ORDER BY.

usted puede conseguir alrededor de este límite con la sintaxis obsoleta:

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

1, ya que es la primera columna que desea agrupar.

7

No sé sobre MySQL, pero en MS SQL, puede utilizar el índice de columna en la cláusula order by. Yo he hecho esto antes cuando se hace el recuento con group by s, ya que tiende a ser más fácil trabajar con ellos.

Así

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

Se convierte en

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

En Oracle, algo como esto funciona muy bien para separar el conteo y ordenar un poco mejor. No estoy seguro de si va a trabajar en 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

parece funcionar para mí en 10.1.14-MariaDB (compatible con MySQL). Pensé que tenía que tener ') como conteos', pero aún funcionaba sin la parte' como'. –

2

Usted puede conseguir alrededor de este límite con la sintaxis obsoleta: ORDER BY 1 DESC

Esta sintaxis no está en desuso en todo, es E121-03 de SQL99.

+4

Esto debería ser un comentario en lugar de una respuesta. –

+7

No debe comentar una respuesta de casi seis años :-) –

+3

Kkkk, es suficiente. –

0

Intentar esta consulta

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

¿Qué tiene esto que ver con la pregunta? Los campos ni siquiera son lo mismo. –