2008-08-26 6 views
89

J'ai un tableau d'étiquettes et je veux obtenir les plus grandes étiquettes de la liste.SQL Group By avec une commande Par

données de l'échantillon ressemble à ceci

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

utilisant

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

me récupère les données que je suis à la recherche parfaitement. Cependant, je voudrais l'organiser, de sorte que le plus grand nombre d'étiquettes soit le premier, et le limiter à m'envoyer seulement les 20 premières.

J'ai essayé ...

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

et je continue à obtenir une "utilisation invalide de la fonction de groupe - ErrNr 1111"

Qu'est-ce que je fais mal?

J'utilise MySQL 4.1.25 Debian

+0

Oui, tout à fait. Terminé. – maxsilver

Répondre

164

Dans toutes les versions de MySQL, tout simplement alias l'agrégat dans la liste SELECT et commande par l'alias:

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

IMHO, ceci est la version plus propre que la réponse choisie. Il est instantanément clair ce qui est commandé par. Bien sûr, si c'est un script rapide, ça n'a pas vraiment d'importance. – JustAPoring

+1

Bien que OP utilise MySQL, cette réponse a également fonctionné pour moi dans HSQL (Libreoffice built-in) –

48

MySQL avant la version 5 ne permettait pas aux fonctions d'agrégation dans la clause ORDER BY.

Vous pouvez contourner cette limite avec la syntaxe dépréciée:

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

1, puisqu'il est la première colonne que vous voulez groupe sur.

7

Je ne connais pas MySQL, mais dans MS SQL, vous pouvez utiliser l'index des colonnes dans la clause order by. Je l'ai déjà fait en faisant des comptes avec group by s car il a tendance à être plus facile à travailler.

Alors

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 
4

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

Semble fonctionner pour moi dans 10.1.14-MariaDB (compatible MySQL). Je pensais que je devais avoir '' comme compte ', mais cela fonctionnait toujours sans la partie' comme '. –

2

Vous pouvez contourner cette limite avec la syntaxe dépréciée: ORDER BY 1 DESC

Cette syntaxe n'est pas dépréciée à Tout, c'est E121-03 de SQL99.

+4

Cela devrait être un commentaire au lieu d'une réponse. –

+7

Vous ne devriez pas commenter une réponse près de six ans :-) –

+3

Kkkk, assez juste. –

0

Essayez cette requête

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'est-ce que cela a à voir avec la question? Les champs ne sont même pas les mêmes. –