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

War es hilfreich?

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 byDas 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top