Grouper par SQL avec un ordre par


122

J'ai une table de balises et je souhaite obtenir le plus grand nombre de balises de la liste.

Les exemples de données ressemblent à ceci

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

en utilisant

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

me récupère parfaitement les données que je recherche. Cependant, je voudrais l'organiser, de sorte que le nombre de balises le plus élevé soit en premier, et le limiter à m'envoyer uniquement les 20 premiers environ.

J'ai essayé ça ...

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

et je reçois toujours un "Utilisation non valide de la fonction de groupe - ErrNr 1111"

Qu'est-ce que je fais mal?

J'utilise MySQL 4.1.25-Debian

Réponses:


199

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

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

9
IMHO, c'est la version plus propre que la réponse sélectionnée. Ce qui est commandé est instantanément clair. Bien sûr, si c'est un script rapide, cela n'a pas vraiment d'importance.
JustAPoring le

1
Bien que OP utilise MySQL, cette réponse a également fonctionné pour moi dans HSQL (Libreoffice intégré)
Arno Teigseth

53

MySQL avant la version 5 n'autorisait pas les 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 c'est la première colonne sur laquelle vous souhaitez regrouper.


8

Je ne connais pas MySQL, mais dans MS SQL, vous pouvez utiliser l'index de colonne dans la order byclause. Je l'ai déjà fait lorsque je fais des décomptes avec group bys car cela 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

6

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

Semble fonctionner pour moi dans 10.1.14-MariaDB (compatible MySQL). Je pensais que je devais l'avoir ) as counts, mais cela fonctionnait toujours sans la aspièce.
Harry Pehkonen

3

Vous pouvez contourner cette limite avec la syntaxe obsolète: ORDER BY 1 DESC

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


5
Cela devrait être un commentaire plutôt qu'une réponse.
Rafael Barros

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

Qu'est-ce que cela a à voir avec la question? Les champs ne sont même pas les mêmes.
Blakes Seven
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.