MySQL « ORDER BY » la quantité de lignes avec la même valeur pour une certaine colonne?

StackOverflow https://stackoverflow.com/questions/1983745

  •  22-09-2019
  •  | 
  •  

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 » ..).

Était-ce utile?

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`
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top