2016-05-22 121 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

相關問題