我正在使用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
答案 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,这样可以产生并产生以下结果:
答案 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')