查询最近30天,但保留没有结果/值的天数

时间:2012-05-31 09:24:47

标签: mysql sql datetime sum

我有以下功能来获取过去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)");

2 个答案:

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

没有测试,因为我手头没有这些结构。内部联接和子查询可能会造成麻烦,您可能需要切换它们。

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