Mysql 返回最近N天的记录,而不是N中的每一天都有记录?

Mysql 返回最近N天的记录,而不是N中的每一天都有记录?,mysql,database,Mysql,Database,我想检索用户过去7天的活动。我查询的表是一个多对多的表,链接用户、事件和日期 如果今天是5月7日,但用户只记录了5月4日和2日的活动,我是否可以构建一个查询,返回与未记录活动的日期对应的空值 来源 May 2 42 May 4 88 所需输出 May 1 NULL May 2 42 May 3 NULL May 4 88 May 5 NULL May 6 NULL May 7 NULL 如何在MySQL中实现这一点 SE

我想检索用户过去7天的活动。我查询的表是一个多对多的表,链接用户、事件和日期

如果今天是5月7日,但用户只记录了5月4日和2日的活动,我是否可以构建一个查询,返回与未记录活动的日期对应的空值

来源

May 2     42
May 4     88
所需输出

May 1     NULL
May 2     42
May 3     NULL
May 4     88
May 5     NULL
May 6     NULL
May 7     NULL
如何在MySQL中实现这一点

SELECT DISTINCT users, events, dates
FROM table
WHERE dates between date_format(date1, '%Y-%m-%d')
and date_format(date2, '%Y-%m-%d')    or NOW() or CURDATE()....
and user = 'username'
这是非常一般的,但是如果您替换名称和日期(可能不需要格式化),那么无论是否使用空占位符,都将返回所有结果

您可以填充一个日期\u引用\u表…以下是此表的存储过程:

我使用日期格式只识别年份和月份,但您可以更改此格式

你还需要一个内部连接然后。。。因此,您可以在date_引用表上进行内部联接,它将输出上述注释中提到的结果

分隔符$$

CREATE PROCEDURE `generate_date_reference_table`(d1 date, d2 date)
BEGIN
declare d datetime;

create table BLMBP.date_reference (d char(7) not null);

set d = d1;
while d <= d2 do
    insert into BLMBP.date_reference (d) values (date_format(d, '%Y-%m'));
    set d = date_add(d, interval 1 month);
end while;

END$$
创建过程“生成日期参考表”(d1日期、d2日期)
开始
宣布日期时间;
创建BLMBP.date_参考表(d字符(7)不为空);
设置d=d1;

然而,如果您可以访问包含日期列表的表,并且没有间隙,那么这将更容易。是否有这样一个表,如果没有,你会考虑创建一个表吗?再加上马克的优秀观点,在应用程序中,如果在结果集中不存在相关的日期,那么可以考虑在应用程序中隐含地假设<代码> null <代码>。