2012-05-31 133 views
3

我有以下函數可獲取過去30天內每天的點數。這個查詢只提取有價值的日子,如果當天沒有獎勵的話,它就不會提取任何東西。我怎樣才能讓它顯示所有的日子,而不管當天是否獲得了積分?查詢最近30天,但保留天數沒有結果/值

例如:

5月31日 - 30分。
5月30日 - 0點。
5月29日 - 5點。
5月28日 - 10點。
5月27日 - 0點。
...

相反的:

5月31日 - 30分。
5月29日 - 5點。
5月28日 - 10點。
...

SELECT date_added, SUM(points) 
FROM points_table pt, userCake_Users u 
WHERE pa.date_added >= (CURDATE() - INTERVAL 30 DAY) 
AND u.user_id = '" . $user_id . "' 
AND u.user_id = pt.user_id 
GROUP BY date(pt.date_added)"); 
+0

這類任務的往往是更適合您的應用程序代碼...爲什麼不只是假設0如果日期是不存在的結果集? – eggyal

回答

0

MySQL不能生成缺少的日期憑空。因此,我的建議是創建一個單獨的表(可能是引擎MEMORY)並將查詢日期插入到那裏。然後,你可以如上加入你的基表:

select date_added, 
(select sum(points_table.points) from points_table where points_table.date_added = inmemorytable.date_added) as "Points" 
from inmemorytable 
inner join userCake_Users u on u.u.user_id = '" . $user_id . "' AND u.user_id = pt.user_id 

沒有測試過,因爲我沒有這些結構在眼前。內部連接和子查詢可能會造成麻煩,您可能必須切換它們。

0

在這種情況下,您可以在內存中使用臨時表,並在必要時用零填充。

我已經寫了一個例程:

SET @start_date = CURDATE() - INTERVAL 30 DAY; 

DROP TEMPORARY TABLE IF EXISTS RawResults; 
CREATE TEMPORARY TABLE RawResults ENGINE = MEMORY 
SELECT date, SUM(test.table.points) 
FROM test.table 
WHERE test.table.date >= @start_date 
GROUP BY test.table.date; 

SET @cur_date = @start_date;  
WHILE @cur_date <= CURDATE() DO  
    IF NOT EXISTS (select * from RawResults where date = @cur_date) THEN 
     INSERT INTO RawResults VALUES (@cur_date, 0); 
    END IF;   
    SET @cur_date = DATE_ADD(@cur_date, INTERVAL 1 DAY); 
END WHILE; 

SELECT * 
FROM RawResults 
ORDER BY date DESC;