MySQL 5.7查询指定日期范围内last_sent非空且last_open为NULL的记录
MySQL 5.7 查询语句修正方案
核心筛选条件
- 目标字段组的
last_sent日期落在2024-01-02至2024-06-30区间内 - 对应组的
last_open为NULL - 排除该字段组中
last_sent与last_open均为NULL的记录
单字段组查询修正(以a_前缀组为例)
SELECT email, a_last_sent, a_last_open FROM your_table WHERE -- 限定发送日期范围 a_last_sent BETWEEN '2024-01-02' AND '2024-06-30' -- 对应打开日期为空 AND a_last_open IS NULL -- 排除该组双空的情况 AND NOT (a_last_sent IS NULL AND a_last_open IS NULL);
多字段组查询修正(含a_、b_等多组字段)
如果需要筛选任意一组满足条件的记录,可使用OR组合各组条件,同时排除所有组均双空的情况:
SELECT email, a_last_sent, a_last_open, b_last_sent, b_last_open FROM your_table WHERE ( (a_last_sent BETWEEN '2024-01-02' AND '2024-06-30' AND a_last_open IS NULL) OR (b_last_sent BETWEEN '2024-01-02' AND '2024-06-30' AND b_last_open IS NULL) -- 可继续添加其他字段组的条件 ) AND NOT ( (a_last_sent IS NULL AND a_last_open IS NULL) AND (b_last_sent IS NULL AND b_last_open IS NULL) -- 若需排除单组双空,将每组的NOT判断移到对应组的条件内即可 );
原查询问题说明
原查询使用+连接条件属于逻辑错误,MySQL中+是算术运算符,会将日期/空值隐式转换为数值,导致条件判断偏离预期。正确做法是使用AND/OR明确逻辑关系,用IS NULL直接判断空值,避免隐式转换干扰。
内容的提问来源于stack exchange,提问作者John Beasley
相关产品推荐
相关产品推荐

