即使没有记录,每周/每月的SQL查询请求也是如此

时间:2016-05-22 11:32:46

标签: mysql count

我正在使用MySQL,我很难获得每月的计数,包括没有记录的月份。

这是我的表"播放":

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

2 个答案:

答案 0 :(得分: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');

以下查询显示玩家37在过去6个月中每月的游戏

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

答案 1 :(得分: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')