我有一个表叫 trends_points, 这表以下列:

  • id(unique id的行)
  • userId(id的用户已进入这个表)
  • 期(一个单词)
  • 时间(a unix timestamp)

现在,我正在运行查询对此表其会得到的排在一个特定的时间框架下令通过多少次列 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

这是因为"新的一年"的存在的三倍的时间,"圣诞"的存在的两倍和"twitter"只有在一个行。

迄今为止我已经asummed这是一个简单的在于具体的时间框架的一部分,查询及团通过停止相同的术语来在列表中的两倍。

这使得以下问题:

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

任何人都不会知道我怎么会做的最后一部分的查询?(订购查询的结果由有多少行包含相同的"术语"栏中的值..).

有帮助吗?

解决方案

使用:

  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

看看 这个问题为什么使用之间的vs使用>=/<=运营商.

记住可以有关系-所以由默认字母顺序排列短的期价值的时候发生这种情况,但也有可能是其他标准。

还有,如果你想另外的数量限制的行/条款回来了你可以加入的 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

其他提示

快速回答:

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() 会给你的号码的行集团,因此只是为了通过。

SELECT * FROM `trends_points`
WHERE ( `time` >= <time-period_start> AND `time` <= <time-period_end> )
ORDER BY COUNT(`term`) DESC
GROUP BY `term`
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top