查询过去 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)");

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
没有

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

在这种情况下,

您可以在内存中使用临时表,并在必要时用零填充它。

我写了下一个例程:

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;

最新更新