2016-05-22 120 views
1

我正在使用MySQL,并且每月都很难计算包括没有记录的月份。即使没有记录,也可以在每周/每月查询SQL请求

这是我的表“戏剧”:

 
idplay idplayer day 
------ -------- --- 
1    26  17-11-2015 
2    37  22-12-2015 
3    65  24-04-2016 
4    12  16-05-2016 
5    37  17-05-2016 
6    37  30-05-2016 
7    14  30-06-2016 

我想要得到的时间玩家“37”已经在每月的最后6个月播放的次数,并得到0时,他并没有发挥。

财产以后这样的:

 
Month   Playtimes 
----   ------- 
11-2015    0 
12-2015    1 
01-2016    0 
02-2016    0 
03-2016    0 
04-2016    0 
05-2016    5 
+1

处理这个问题有点不重要,因为你需要所有月份的某个地方的数据。一个不错的选择是让你创建一个包含你的数据的月份和年份的表格。然后加入上面的表格。 –

回答

3

对于这项工作,如评论所说,我创建了一个新的关系那么简单列出个月(我已经在过去一年中使用的值) 。

然后使用左外连接将它们与Plays表中的月份相匹配,仅对应于与指定播放器匹配的播放。

然后使用查询对这些行进行计数,并将零值归于零。

创建语句在这里;

CREATE TABLE Months (day DATE); 
INSERT INTO Months VALUES 
('2015.11.1'),('2015.12.1'),('2016.1.1'), 
('2016.2.1'), ('2016.2.1'), ('2016.3.1'), 
('2016.4.1'), ('2016.5.1'), ('2016.6.1'), 
('2016.7.1'), ('2016.8.1'), ('2016.9.1'), 
('2016.10.1'), ('2016.11.1'); 

和下面的查询,以显示每月的游戏,在过去6个月内,由玩家37在这里

SELECT DATE_FORMAT(M.day,'%Y-%m') AS Month, COUNT(idPlayer) AS Playtimes 
FROM Months M 
LEFT JOIN (SELECT * 
      FROM Plays 
      WHERE Plays.idPlayer = 37) P 
ON MONTH(M.day) = MONTH(P.day) 
AND YEAR(M.day) = YEAR(P.day) 
WHERE M.day BETWEEN (NOW() - INTERVAL 6 Month) 
    AND NOW() 
GROUP BY M.day; 

我创建成一个SQL fiddle以及其中这里工作和将产生以下结果:

enter image description here

+0

错误代码:1305. FUNCTION DATEPART不存在:/ –

+0

别担心。查看新版本ive换了出来 – davidhood2

+0

这只返回记录的月份。其他月份没有包括 –

0

像这样的东西应该工作:

SELECT DATE_FORMAT(day, '%c-%Y') Month, COUNT(day) Playtimes 
FROM Plays 
WHERE idplayer = 37 AND day BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW() 
GROUP BY DATE_FORMAT(day, '%c-%Y') 
+0

这并没有找到每月播放的次数 - 但每天的播放次数肯定是 – davidhood2

+0

错误代码:1054.'字段列表'中的未知列'天' –

+0

对不起,修好了!感谢您指出@ davidhood2。我已经测试过了,这个工作非常好! – designcise

相关问题