3

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

2 回答 2

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;
于 2012-05-31T10:29:02.010 回答
0

MySQL 不能凭空生成缺失的日期。因此,我的建议是创建一个单独的表(可能是引擎内存)并将查询日期插入其中。然后你可以加入你的基表,如上:

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

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

于 2012-05-31T10:03:45.180 回答