MySQL“ORDER BY”某一列的行数是否相同?

时间:2009-12-31 03:05:09

标签: sql mysql ranking

我有一个名为trends_points的表,此表包含以下列:

  • id(行的唯一ID)
  • userId(在表格中输入此内容的用户的ID)
  • term(一个字)
  • 时间(unix时间戳)

现在,我正在尝试对此表运行查询,该查询将获取特定时间范围内的行,这些行按特定时间范围内列term列出现的次数排序...所以例如,如果表格包含以下行:

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

我希望这些行的排序如下:

new year
christmas
twitter

这是因为“新年”在时间框架内存在三次,“圣诞节”存在两次,“推特”只存在一行。

到目前为止,我已经认为它是查询的特定时间范围部分的简单WHERE,以及GROUP BY来阻止同一个术语在列表中出现两次。

这会产生以下查询:

SELECT * 
  FROM `trends_points` 
 WHERE ( time >= <time-period_start> 
  AND time <= <time-period_end> ) 
GROUP BY `term`

有谁知道我将如何处理查询的最后部分? (按查询的结果排序多少行包含相同的“term”列值。)。

4 个答案:

答案 0 :(得分:11)

使用:

  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

请参阅this question about why to use BETWEEN vs using the >=/<= operators

请记住,可能存在关联 - 默认情况下,订单按字母顺序按字母顺序缩短,但可能还有其他标准。

此外,如果您想要额外限制返回的行数/术语数,可以将LIMIT clause添加到查询的末尾。例如,此查询将返回前五个术语:

  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

答案 1 :(得分:4)

快速回答:

SELECT 
   term, count(*) as thecount
FROM 
   mytable
WHERE
   (...)
GROUP BY 
   term
ORDER BY 
   thecount DESC

答案 2 :(得分:2)

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

答案 3 :(得分:1)

COUNT()将为您提供组中的行数,因此只需按顺序排序。

SELECT * FROM `trends_points`
WHERE ( `time` >= <time-period_start> AND `time` <= <time-period_end> )
ORDER BY COUNT(`term`) DESC
GROUP BY `term`