1

我当前的 SQL 看起来像这样 -

SELECT i.id, 
       i.name,
       i.description,
       c.name campaign,
       count(h.id) hits
FROM items i 
LEFT JOIN campaigns c ON c.id = i.campaignid
LEFT JOIN links l ON l.itemid = i.id
LEFT JOIN hits h ON h.linkid = l.id
GROUP BY i.id

我想对此进行修改,以便返回带有 h.id 的 count() 的第 6 列,但仅包括过去 30 天的“命中”。因此,假设总共有 100 次“点击”,过去 30 天内有 50 次,那么第 5 列将是 100,第 6 列将是 50。

抱歉,如果我的描述很罗嗦...

4

3 回答 3

4
SELECT i.id, 
       i.name,
       i.description,
       c.name campaign,
       count(h.id) hits,
       COUNT( CASE WHEN h.hitdate >= CURDATE() - INTERVAL 29 DAY
                     THEN h.hitdate 
                     ELSE NULL
              END
            ) AS last_30_days_hits
FROM ...

您可以使用更短的(但不一定更快):

       SUM( h.hitdate >= CURDATE() - INTERVAL 29 DAY )
         AS last_30_days_hits
于 2012-12-28T23:51:09.870 回答
0

您应该可以添加一个where子句吗?类似于...的东西

WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= h.hitdate

h.hitdate 将是命中记录的日期时间字段。如果您使用时间戳,只需计算 h.hitdate >= (time() - 2592000) 的位置。

于 2012-12-28T23:53:45.617 回答
0

您可以在 ON 子句或 WHERE 子句中添加 30 天过滤器,如下所示:

LEFT JOIN hits h ON h.linkid = l.id AND h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)

或者

WHERE h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)
于 2012-12-29T00:40:41.320 回答