SQL Group By con un Order By

122

Tengo una tabla de etiquetas y quiero obtener las etiquetas de mayor recuento de la lista.

Los datos de muestra se ven así

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

utilizando

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

me devuelve los datos que estoy buscando perfectamente. Sin embargo, me gustaría organizarlo, para que los recuentos de etiquetas más altos sean los primeros, y limitarlo a que solo me envíe los primeros 20 más o menos.

Intenté esto ...

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

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

¿Qué estoy haciendo mal?

Estoy usando MySQL 4.1.25-Debian

maxsilver
fuente

Respuestas:

199

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

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
Scott Noyes
fuente
9
En mi humilde opinión, esta es la versión más limpia que la respuesta seleccionada. Al instante queda claro lo que ordena. Por supuesto, si es un script rápido, eso realmente no importa.
JustAPoring
1
Aunque OP está utilizando MySQL, esta respuesta también funcionó para mí en HSQL (Libreoffice incorporado)
Arno Teigseth
53

MySQL anterior a la versión 5 no permitía funciones agregadas en las cláusulas ORDER BY.

Puede sortear 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 en la que desea agrupar.

Lasse V. Karlsen
fuente
8

No sé acerca de MySQL, pero en MS SQL, puede usar el índice de columna en la order bycláusula. He hecho esto antes cuando hago cuentas con group bys, ya que tiende a ser más fácil trabajar con ellas.

Entonces

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

Se convierte

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

En Oracle, algo como esto funciona muy bien para separar un poco el conteo y el pedido. No estoy seguro de si funcionará 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
JosephStyons
fuente
Parece funcionar para mí en 10.1.14-MariaDB (compatible con MySQL). Pensé que tenía que tener ) as counts, pero todavía funcionó sin la asparte.
Harry Pehkonen
3

Puede sortear este límite con la sintaxis obsoleta: ORDER BY 1 DESC

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

Damien B
fuente
55
Esto debería ser un comentario en lugar de una respuesta.
Rafael Barros
0

Prueba 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
Ashutosh Gupta
fuente
¿Qué tiene esto que ver con la pregunta? Los campos ni siquiera son iguales.
Blakes Seven