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