我当前的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
我想修改它,以便返回第6列,其中包含h.id的count(),但仅包括过去30天内的“点击”。假设整体上有100个“点击”,过去30天有50个,第5列为100,第6列为50。
如果我的描述非常冗长,请道歉......
答案 0 :(得分: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
答案 1 :(得分:0)
您应该只能添加where子句吗?有些东西......
WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= h.hitdate
h.hitdate将是命中记录的日期时间字段。如果您正在使用时间戳,只需计算h.hitdate&gt; =(time() - 2592000)的位置。
答案 2 :(得分:0)
您可以在ON子句或WHERE子句中添加30天过滤器,如下所示:
LEFT JOIN hits h ON h.linkid = l.id AND h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)
OR
WHERE h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)