gpt4 book ai didi

mysql - mysql数据库中没有找到记录时如何增加计数器值

转载 作者:行者123 更新时间:2023-11-29 19:21:57 25 4
gpt4 key购买 nike

这是一个概念:

我创建了一个网站,我想知道每天的 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')

对于情况 1 (website_history_1),考虑数据存在"is"或“否”的情况。我在这里得到了计数。

对于案例2 (website_history_2)表 Website_history_2 中没有可用数据,因为表为空,因此不会计算任何内容。

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

最后我需要什么?

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

最佳答案

为您提供一个可能的解决方案。这最多可以处理 1000 天(很容易扩展)。

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

这是根据匹配日期对真实表进行左外连接。这将为您提供范围内的每个日期以及该日期的点击次数(其中包括点击次数为 0 的天数)。

然后将其用作外部 SELECT 的源,外部 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)

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

关于mysql - mysql数据库中没有找到记录时如何增加计数器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42388752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com