SQL Group By mit einem Order By

122

Ich habe eine Tabelle mit Tags und möchte die Tags mit der höchsten Anzahl aus der Liste erhalten.

Beispieldaten sehen so aus

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

mit

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

bringt mir die Daten zurück, nach denen ich perfekt suche. Ich möchte es jedoch so organisieren, dass die höchsten Tag-Zählungen an erster Stelle stehen, und es so beschränken, dass mir nur die ersten 20 oder so gesendet werden.

Ich habe es versucht ...

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

und ich bekomme immer wieder eine "Ungültige Verwendung der Gruppenfunktion - ErrNr 1111"

Was mache ich falsch?

Ich benutze MySQL 4.1.25-Debian

Maxsilber
quelle

Antworten:

199

Aliasen Sie in allen Versionen von MySQL einfach das Aggregat in der SELECT-Liste und ordnen Sie es nach dem Alias:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
Scott Noyes
quelle
9
IMHO, dies ist die sauberere Version als die ausgewählte Antwort. Es ist sofort klar, von was bestellt wird. Wenn es sich um ein schnelles Skript handelt, spielt das natürlich keine Rolle.
JustAPoring
1
Obwohl OP MySQL verwendet, funktionierte diese Antwort auch für mich in HSQL (Libreoffice integriert)
Arno Teigseth
53

MySQL vor Version 5 erlaubte keine Aggregatfunktionen in ORDER BY-Klauseln.

Sie können diese Grenze mit der veralteten Syntax umgehen:

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

1, da es die erste Spalte ist, in der Sie gruppieren möchten.

Lasse V. Karlsen
quelle
8

Ich weiß nichts über MySQL, aber in MS SQL können Sie den Spaltenindex in der order byKlausel verwenden. Ich habe dies schon einmal gemacht, wenn ich mit group bys zähle, da es in der Regel einfacher ist, damit zu arbeiten.

So

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

Wird

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

In Oracle funktioniert so etwas gut, um das Zählen und Bestellen ein wenig besser zu trennen. Ich bin nicht sicher, ob es in MySql 4 funktionieren wird.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc
JosephStyons
quelle
Scheint für mich in 10.1.14-MariaDB (MySQL-kompatibel) zu funktionieren. Ich dachte, ich müsste haben ) as counts, aber es funktionierte immer noch ohne das asTeil.
Harry Pehkonen
3

Sie können diese Grenze mit der veralteten Syntax umgehen: ORDER BY 1 DESC

Diese Syntax ist überhaupt nicht veraltet, sondern E121-03 von SQL99.

Damien B.
quelle
5
Dies sollte ein Kommentar anstelle einer Antwort sein.
Rafael Barros
0

Versuchen Sie diese Abfrage

 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
quelle
Was hat das mit der Frage zu tun? Die Felder sind nicht einmal gleich.
Blakes Seven