0

我有一个带有关联 feed_id 和创建时间戳的订阅表。一个提要有 N 个订阅。

group使用查询来计算每个 feed_id 的记录数很容易显示最流行的提要。但我想计算动量以显示大多数趋势提要。

一个简化的算法是:

momentum of feed_id =
    10 * (count of subscriptions with created_at in past day)
  + 5 *  (count of subscriptions with created_at from 2-7 days ago)
  + 1 *  (count of subscriptions with created_at from 7-28 days ago)

如何在单个(My)SQL 查询中完成这样的事情,而不是使用 3 个查询并以编程方式对结果求和?

4

2 回答 2

2

您可以为此使用条件聚合。MySQL 将布尔值视为整数,true 为“1”,因此您可以将表达式求和。

我猜它看起来像这样:

select feedid,
       (10 * sum(createdat >= date_sub(now(), interval 1 day)) +
         5 * sum(createdat >= date_sub(now(), interval 7 day) and
                 createdat < date_sub(now(), interval 1 day)) +
         1 * sum(createdat >= date_sub(now(), interval 28 day) and
                 createdat < date_sub(now(), interval 7 day))
       ) as momentum
from subscriptions
group by feedid
于 2015-03-15T12:26:19.113 回答
1
SELECT 10*COUNT(IF(created_at >= CURDATE(), 1, 0)) +
       5*COUNT(IF(created_at BETWEEN DATE_ADD(CURDATE(), - INTERVAL 7 days) AND DATE_ADD(CURDATE(), - INTERVAL 1 day), 1, 0) +
       1*COUNT(IF(created_at BETWEEN DATE_ADD(CURDATE(), - INTERVAL 28 days) AND DATE_ADD(CURDATE(), - INTERVAL 8 day), 1, 0)
FROM ...

我不是 100% 确定我已经抓住了边缘条件(昨天或 8 天前)以获得完全正确的计数。你会想要测试它。

如果您对 24 小时周期感兴趣,那么只需替换NOW()CURDATE()一切都会转到 DATETIME。

于 2015-03-15T12:32:51.953 回答