118 votes

SQL Group By avec une Commande Par

J'ai une table de balises et que vous souhaitez obtenir le nombre le plus élevé de balises à partir de la liste.

Les données de l'échantillon ressemble à ceci

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

à l'aide de

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

me met à dos les données que je suis à la recherche de la perfection. Cependant, je tiens à les organiser, de sorte que la plus haute étiquette de compte sont d'abord, et de la limiter à seulement m'envoyer les 20 premières.

J'ai essayé ce...

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

et je reçois Invalide "utilisation de la fonction de groupe - ErrNr 1111"

Ce que je fais mal?

Je suis de l'utilisation de MySQL 4.1.25-Debian

194voto

Scott Noyes Points 611

Dans toutes les versions de MySQL, il suffit de l'alias de l'agrégat dans la liste de sélection et de commande par l'alias:

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

51voto

Lasse V. Karlsen Points 148037

MySQL antérieures à la version 5 ne permettent pas de fonctions d'agrégation dans les clauses ORDER BY.

Vous pouvez contourner cette limite avec la syntaxe obsolète:

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

1, car il est le premier de la colonne que vous souhaitez regrouper.

8voto

jerhinesmith Points 5425

Je ne sais pas à propos de MySQL, mais dans MS SQL, vous pouvez utiliser l'index de colonne dans l' order by de la clause. J'ai fait ça avant, quand on fait qui compte, au group bys car il a tendance à être plus facile de travailler avec.

Donc

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

Devient

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

5voto

JosephStyons Points 21187

Dans Oracle, quelque chose comme cela fonctionne très bien pour séparer votre comptage et de commande un peu mieux. Je ne sais pas si cela fonctionnera 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

2voto

Damien B Points 1608

Vous pouvez contourner cette limite avec la syntaxe obsolète: COMMANDE PAR 1 DESC

Cette syntaxe n'est pas obsolète du tout, c'est E121-03 de SQL99.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X