作为LEFT JOIN语句的一部分,返回最近30天内的项目的count()

时间:2012-12-28 23:44:17

标签: mysql sql left-join

我当前的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。

如果我的描述非常冗长,请道歉......

3 个答案:

答案 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)