Php MySQL查询存在间隔问题,如果未提供数据,则需要0

Php MySQL查询存在间隔问题,如果未提供数据,则需要0,php,mysql,sql,date,intervals,Php,Mysql,Sql,Date,Intervals,我有以下声明: SELECT count(rs.rsc_id) as counter FROM shots as rs where rsc_rs_id = 345354 AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH)) GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m') rs.timestamp是unix时间戳 SELECT count(rs.rsc_id) as count

我有以下声明:

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
rs.timestamp是unix时间戳

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
每行/每个月的输出类似于“28”这样的数字

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
它工作得很好,但是如果我有不一致的数据,比如只有过去三个月的数据(不是所有六个月的数据),我就不会从数据库中得到任何回报。我想每次都有没有这个月的数据,0返回

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
有什么建议吗? 我考虑过一些案例陈述,但这似乎不太好

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')

谢谢

在这种情况下,通常使用包含所有日期(例如1970年1月1日至2999年12月31日)的
日期表,然后
将数据左键连接到该表中

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
请参见此处答案中的示例:

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
如果创建日期表,则可以使用:

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')
SELECT
DATE_FORMAT(d.date,'%Y%m') AS `month`, count(rs.rsc_id) AS `counter`
FROM dates d
LEFT JOIN shots as rs
   ON d.date = FROM_UNIXTIME(rs.timestamp)
   AND rs.rsc_rs_id = 345354
WHERE d.date > DATE_SUB(CURDATE(), INTERVAL 5 MONTH)
AND d.date < CURDATE()
GROUP BY DATE_FORMAT(d.date,'%Y%m');
选择
日期格式(d.DATE,%Y%m')为“月”,计数(rs.rsc\u id)为“计数器”`
从日期d开始
左连击
在d.date=从_UNIXTIME(rs.timestamp)
和rs.rsc_rs_id=345354
其中d.date>date_SUB(CURDATE(),间隔5个月)
和d.date
只有6个月的时间,日期表似乎没有必要,尽管这看起来很复杂(事实并非如此!)

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')

按照您编写此查询的方式,您将取当前日期(2011年3月18日),减去六个月(2010年9月18日),然后从该日期(2010年)开始取年份。然后搜索该年的所有记录。这忽略了今年的前3个月,也考虑到了现在(2010年1月)已经有15个月了。你是不是想做
和rs.timestamp>DATE\u SUB(CURDATE(),间隔6个月)
?啊,你说得对,谢谢!!但是有没有办法用一个简单的0来填充剩下的几个月没有数据的情况?所以我总是得到6行的返回?如果rs.timestamp是unix timestamp=>year(rs.timestamp)是NULL谢谢,不,我只是做了一个计数器为NULL的例子,那么0如果我错了,请更正我,但unix timestamp保留的日期超过2038年1月19日。因此,月份列表可能会稍微减少。:)@正确,这就是为什么我通常不使用unix时间戳,我喜欢提前计划:)我表中的日期是时间戳,我会相应地进行编辑。谢谢当然,左连接。。。但这个解决方案似乎不适合速度。相反,我使用了一个类似于
selectdate\u格式(DATE\u-SUB(CURDATE(),INTERVAL 6-MONTH),“%Y%m”)的subselect语句,数据联合选择DATE\u格式(DATE\u-SUB(CURDATE(),INTERVAL 5-MONTH),“%Y%m”)数据联合…
我尝试了一下,但这似乎不起作用<代码>选择日期格式(N.PivotDate,“%Y%m”)从(选择添加日期(CURDATE(),间隔N个月)数据透视日期从(选择0 N全部联合选择1全部联合选择2全部联合选择3全部联合选择4全部联合选择5全部联合选择6)N)N
这一个抛出错误:
您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在“ADDDATE(CURDATE(),INTERVAL N MONTH)PivotDate FROM”附近使用的正确语法(在第3行选择“0 N”
@Michael我单独尝试了该部分,它给了我7行。您使用的是哪个MySQL版本?@Richard aka cyberkiwi我有5.0.51a-3ubuntu5.8版-log@Michael里面的所有内容都应该使用5.0。但是试着用
DATE\u ADD
替换
ADDDATE\u ADD
@Richard哦,好了,现在可以了!Strange的东西,当我从这里复制代码时,有一些看不见的字符…我使用它将代码转换成纯文本。