如何在mysql数据库中找不到记录时增加计数器值

时间:2017-02-22 10:34:24

标签: mysql

这是概念:

我创建了一个网站,我想明天知道NO-HITS计数。

假设我在2017年1月2日举办了一个网站,2017年2月1日首次由某人开放。 因此,我想要的计数是特定月份网站未被点击的总天数。这里的计数应该是1月份的30。

2月10日和2月20日点击了下一个网站。

所以我想要的最终计数是:( 2月22日)

1月30日

2月 - 19日

表格可以被视为:

Website_information_table

id websiteLaunchedDate

1  2-Jan-2017

Website_history_1

id isWebSiteClicked epochTime

1 YES 1-Feb-2017

2 YES 10-Feb-2017 ....

Website_history_2

id isWebSiteClicked epochTime

我当前的查询是:

select month1 as DATE, SUM(day_count) as counter from( SELECT epochTime AS month1, 
if(SUM(isWebsiteClicked='YES') > 0, 0, 1) AS day_count 
FROM myTable 
where 
id=1 
and 
epochTime between '2017-01-01 00:00:00' and '2017-02-22 15:23:13' 
GROUP BY DATE_FORMAT(epochTime, '%Y%m%d')) as alias GROUP BY DATE_FORMAT(month1, '%Y%m')   

对于case1(website_history_1),会考虑数据是YES还是NO。在这里,我得到了统计数据。

对于case2(website_history_2) 表Website_history_2中没有可用的数据,因为表是空的,所以没有任何数据被计算在内。

注意:在任何情况下,Website_information_table都不会为空。

最后我需要什么?

  1. 如果没有记录,则总天数(按月计算)。

1 个答案:

答案 0 :(得分:0)

可能的解决方案。这将处理长达1000天(很容易扩展)。

它的工作原理是获取范围开始月份的第一天和范围结束的月份的最后一天。如果然后返回第一个日期加上最多1000天而小于最后一天。

根据匹配日期,这是对真实表的LEFT OUTER JOIN。这将为您提供该范围内的每个日期以及该日期的点击次数(包括点击次数为0的天数)。

然后将其用作外部SELECT的源,它获取月份和年份,并使用SUM计算具有0次点击的月份和年份的行数。

SELECT MONTH(out_date), 
        YEAR(out_date),
        SUM(IF(site_used = 0, 1, 0))
FROM
(
    SELECT DATE(sub1.each_day) AS out_date,
            COUNT(myTable.id) AS site_used
    FROM 
    (
        SELECT DATE_ADD(start_date, INTERVAL (units.a + 10 * tens.a + 100 * hundreds.a) DAY) AS each_day
        FROM
        (
            SELECT DATE_SUB(DATE(MIN(epochTime)), INTERVAL DAYOFMONTH(DATE(MIN(epochTime)))-1 DAY) AS start_date, 
                    LAST_DAY(DATE(MAX(epochTime))) AS end_date
            FROM myTable
            WHERE epochTime between '2017-01-01 00:00:00' and '2017-02-22 15:23:13'
        ) sub0
        CROSS JOIN (SELECT 1 AS a UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) units
        CROSS JOIN (SELECT 1 AS a UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) tens
        CROSS JOIN (SELECT 1 AS a UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) hundreds
        WHERE DATE_ADD(start_date, INTERVAL (units.a + 10 * tens.a + 100 * hundreds.a) DAY) <= end_date
    ) sub1
    LEFT OUTER JOIN myTable
    ON sub1.each_day = DATE(myTable.epochTime)
    GROUP BY DATE(sub1.each_day)
) sub2
GROUP BY MONTH(out_date), 
        YEAR(out_date)

您可以轻松扩展此范围以涵盖更大或更小的日期范围,并且您可以通过在查询中分割月份和年份来提高性能