MySQL « ORDER BY » la quantité de lignes avec la même valeur pour une certaine colonne?
Question
J'ai une table appelée trends_points
, ce tableau a les colonnes suivantes:
- id (l'identifiant unique de la ligne)
- userId (l'identifiant de l'utilisateur qui est entré dans ce dans le tableau)
- terme (un mot)
- le temps (un horodatage unix)
Maintenant, je suis en train d'exécuter une requête sur ce tableau qui obtenir les lignes dans un laps de temps spécifique commandé par combien de fois la term
colonne apparaît dans la table au cours de la période spécifique ... Ainsi, par exemple si le table contient les lignes suivantes:
id | userId | term | time
------------------------------------
1 28 new year 1262231638
2 37 new year 1262231658
3 1 christmas 1262231666
4 34 new year 1262231665
5 12 christmas 1262231667
6 52 twitter 1262231669
Je voudrais les lignes de sortir ordre comme ceci:
new year
christmas
twitter
En effet, « nouvelle année » existe trois fois dans la période, « Noël » existe deux fois et « twitter » est seulement dans une rangée.
Jusqu'à présent, je l'ai asummed c'est un simple où pour la partie de calendrier précis de la requête et GROUP BY pour arrêter le même terme de venir deux fois dans la liste.
Ceci rend la requête suivante:
SELECT *
FROM `trends_points`
WHERE ( time >= <time-period_start>
AND time <= <time-period_end> )
GROUP BY `term`
Quelqu'un sait comment je ferais la dernière partie de la requête? (Commande des résultats de la requête par le nombre de lignes contiennent la même valeur de la colonne « terme » ..).
La solution
Utilisation:
SELECT tp.term,
COUNT(*) 'term_count'
FROM TREND_POINTS tp
WHERE tp.time BETWEEN <time-period_start> AND <time-period_end>
GROUP BY tp.term
ORDER BY term_count DESC, tp.term
Voir cette question de savoir pourquoi utiliser ENTRE vs utilisant le> = / <= opérateurs .
Gardez à l'esprit qu'il peut y avoir des liens -. L'ordre par défaut de court-circuiter par ordre alphabétique par valeur à long terme lorsque cela se produit, mais il pourrait y avoir d'autres critères
En outre, si vous souhaitez limiter en outre le nombre de lignes / termes revenir, vous pouvez ajouter le clause de LIMIT
à la fin de la requête. Par exemple, cette requête renvoie les cinq premiers termes:
SELECT tp.term,
COUNT(*) 'term_count'
FROM TREND_POINTS tp
WHERE tp.time BETWEEN <time-period_start> AND <time-period_end>
GROUP BY tp.term
ORDER BY term_count DESC, tp.term
LIMIT 5
Autres conseils
Réponse rapide:
SELECT
term, count(*) as thecount
FROM
mytable
WHERE
(...)
GROUP BY
term
ORDER BY
thecount DESC
SELECT t.term
FROM trend_points t
WHERE t.time >= <time-period_start> AND t.time <= <time-period_end>
ORDER BY COUNT(t.term) DESC
GROUP BY t.term
COUNT()
vous donnera le nombre de lignes dans le groupe, donc il suffit de commander par cela.
SELECT * FROM `trends_points`
WHERE ( `time` >= <time-period_start> AND `time` <= <time-period_end> )
ORDER BY COUNT(`term`) DESC
GROUP BY `term`