MySQL仅在月末执行插入行的实现问题求助
问题原因
你的SQL语句中,当当日不是月末时,WHERE里的日期条件不成立,但SELECT count(*)仍会返回0(因为count(*)在没有匹配行时始终返回0),所以会插入一行count=0的记录。要解决这个问题,核心是让SELECT语句在非月末时不返回任何结果行,这样INSERT就不会执行任何操作。
解决方案
以下两种方法都能满足你的需求:
方案一:子查询过滤日期条件
INSERT INTO ns_monthly_count (count) SELECT cnt FROM ( SELECT count(*) AS cnt FROM ns_accounts a WHERE a.statusID = 1 ) AS account_stats WHERE CURDATE() = LAST_DAY(CURDATE());
逻辑说明:先统计符合statusID=1的账户数量,再在外层判断当日是否为月末。只有满足日期条件时,才返回统计值并执行插入;非月末时结果集为空,不会插入任何行。
方案二:使用HAVING子句
INSERT INTO ns_monthly_count (count) SELECT count(*) FROM ns_accounts a WHERE a.statusID = 1 HAVING CURDATE() = LAST_DAY(CURDATE());
逻辑说明:利用count(*)是聚合函数的特性,HAVING子句会对聚合后的结果进行过滤。当日期条件不满足时,整个查询无结果返回,因此不会执行插入;月末时则返回统计数量并完成插入。
内容的提问来源于stack exchange,提问作者ceaiius
相关产品推荐
相关产品推荐

