4

我有一个名为 的表trends_points,该表具有以下列:

  • id(行的唯一id)
  • userId(在表中输入的用户的 id)
  • 术语(一个词)
  • 时间(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

这是因为“新年”在时间范围内出现了 3 次,“圣诞节”出现了两次,而“推特”只有一行。

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

这将进行以下查询:

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

有谁知道我将如何做查询的最后一部分?(按包含相同“术语”列值的行数对查询结果进行排序......)。

4

4 回答 4

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

请参阅有关为什么使用 BETWEEN 与使用 >=/<= 运算符的问题

请记住,可能存在联系 - 发生这种情况时,默认情况下顺序按术语值按字母顺序缩短,但可能还有其他标准。

此外,如果您想另外限制返回的行/术语的数量,您可以将LIMIT子句添加到查询的末尾。例如,此查询将返回前五个字词:

  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
于 2009-12-31T03:32:35.740 回答
4

快速回答:

SELECT 
   term, count(*) as thecount
FROM 
   mytable
WHERE
   (...)
GROUP BY 
   term
ORDER BY 
   thecount DESC
于 2009-12-31T03:11:12.803 回答
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
于 2009-12-31T03:13:39.213 回答
1

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

SELECT * FROM `trends_points`
WHERE ( `time` >= <time-period_start> AND `time` <= <time-period_end> )
ORDER BY COUNT(`term`) DESC
GROUP BY `term`
于 2009-12-31T03:10:19.687 回答