SQL-groeperen door met een bestelling door

Ik heb een tabel met tags en wil het hoogste aantal tags uit de lijst halen.

Voorbeeldgegevens zien er zo uit

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

met

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

geeft me perfect de gegevens terug waarnaar ik op zoek ben. Ik wil het echter zo organiseren dat de hoogste tag-tellingen het eerst zijn, en het beperken om me alleen de eerste 20 of zo te sturen.

Ik heb dit geprobeerd…

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

en ik krijg steeds de melding “Ongeldig gebruik van groepsfunctie – ErrNr 1111”

Wat doe ik verkeerd?

Ik gebruik MySQL 4.1.25-Debian


Antwoord 1, autoriteit 100%

In alle versies van MySQL, alias het aggregaat in de SELECT-lijst en sorteer op alias:

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

Antwoord 2, autoriteit 25%

MySQL voor versie 5 stond geen statistische functies toe in ORDER BY-clausules.

U kunt deze limiet omzeilen met de verouderde syntaxis:

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

1, aangezien dit de eerste kolom is waarop u wilt groeperen.


Antwoord 3, autoriteit 5%

Ik weet niets van MySQL, maar in MS SQL kun je de kolomindex gebruiken in de order by-clausule. Ik heb dit eerder gedaan toen ik tellingen deed met group bys, omdat het meestal gemakkelijker is om mee te werken.

Dus

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

Wordt

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

Antwoord 4, autoriteit 3%

In Oracle werkt zoiets moois om je tellen en bestellen een beetje beter te scheiden. Ik weet niet zeker of het zal werken in MySql 4.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

Antwoord 5

Je kunt deze limiet omzeilen met de verouderde syntaxis:
BESTELLEN VOOR 1 OMSCHRIJVING

Deze syntaxis is helemaal niet verouderd, het is E121-03 van SQL99.


Antwoord 6

Probeer deze zoekopdracht

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

Other episodes