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 by
s, 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