SQL Group By mit Order By
-
09-06-2019 - |
Frage
Ich habe eine Tabelle mit Tags und möchte die Tags mit der höchsten Anzahl aus der Liste abrufen.
Beispieldaten sehen so aus
id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')
verwenden
SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`
bringt mir perfekt die Daten zurück, nach denen ich suche.Ich möchte es jedoch so organisieren, dass die höchste Tag-Anzahl an erster Stelle steht, und es so beschränken, dass mir nur etwa die ersten 20 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 erhalte ständig die Meldung „Ungültige Verwendung der Gruppenfunktion – ErrNr 1111“.
Was mache ich falsch?
Ich verwende MySQL 4.1.25-Debian
Lösung
Geben Sie in allen MySQL-Versionen einfach einen Alias für das Aggregat in der SELECT-Liste ein und sortieren Sie nach dem Alias:
SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
Andere Tipps
MySQL vor Version 5 erlaubte keine Aggregatfunktionen in ORDER BY-Klauseln.
Sie können dieses Limit mit der veralteten Syntax umgehen:
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20
1, da es sich um die erste Spalte handelt, nach der Sie gruppieren möchten.
Ich weiß nichts über MySQL, aber in MS SQL können Sie den Spaltenindex im verwenden order by
Klausel.Ich habe das schon einmal gemacht, als ich mit gezählt habe group by
Das liegt daran, dass es tendenziell einfacher ist, damit zu arbeiten.
Also
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
In Oracle funktioniert so etwas gut, um Ihr Zählen und Bestellen etwas 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
Sie können dieses Limit mit der veralteten Syntax umgehen:ORDNUNG NACH 1 BESCHR
Diese Syntax ist überhaupt nicht veraltet, sie ist E121-03 von SQL99.
Probieren Sie diese Abfrage aus
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