Έχω έναν πίνακα με ετικέτες και θέλω να πάρω τις ετικέτες με τον υψηλότερο αριθμό από τη λίστα.
Το δείγμα δεδομένων μοιάζει με αυτό
id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')
χρησιμοποιώντας
SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`
μου δίνει πίσω τα δεδομένα που ψάχνω τέλεια. Ωστόσο, θα ήθελα να το οργανώσω, έτσι ώστε οι υψηλότεροι αριθμοί ετικετών να είναι πρώτοι, και να το περιορίσω να μου στέλνει μόνο τις πρώτες 20 περίπου.
Δοκίμασα αυτό...
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20
και συνεχίζω να λαμβάνω ένα "Μη έγκυρη χρήση της συνάρτησης ομάδας - ErrNr 1111",
Τι κάνω λάθος;
Χρησιμοποιώ τη MySQL 4.1.25-Debian.
Η MySQL πριν από την έκδοση 5 δεν επέτρεπε τις συναρτήσεις συνάθροισης σε ρήτρες ORDER BY.
Μπορείτε να παρακάμψετε αυτό το όριο με την απαρχαιωμένη σύνταξη:
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20
1, αφού είναι η πρώτη στήλη στην οποία θέλετε να ομαδοποιήσετε.
Δεν γνωρίζω για τη MySQL, αλλά στην MS SQL, μπορείτε να χρησιμοποιήσετε το δείκτη στήλης στη ρήτρα order by
. Το έχω ξανακάνει αυτό όταν κάνω μετρήσεις με group by
s, καθώς τείνει να είναι πιο εύκολο να δουλέψει κανείς.
Έτσι
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20
Γίνεται
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20
Στην Oracle, κάτι τέτοιο λειτουργεί ωραία για να διαχωρίσετε λίγο καλύτερα την καταμέτρηση και την παραγγελία σας. Δεν είμαι σίγουρος αν θα λειτουργήσει στη MySql 4.
select 'Tag', counts.cnt
from
(
select count(*) as cnt, 'Tag'
from 'images-tags'
group by 'tag'
) counts
order by counts.cnt desc