MySQL查询中如何按date2存在状态及与NOW()对比过滤数据行?
问题解答
你的现有写法不可行,原因如下
- 语法不合法:
COUNT()是聚合函数,不能直接在WHERE子句中使用,同时你编写的IF语句用法完全不符合MySQL语法规范,直接执行会抛出语法错误。 - 逻辑不匹配:你写的逻辑是统计对应用户下所有带非空
date2值的记录总数,和你需要的逐行判断当前行的date2是否满足过滤规则的需求完全不符,就算修复语法问题也得不到正确结果。
正确实现方式
你不需要用到IF语句,直接把你的过滤规则转成WHERE条件即可:
你的过滤规则等价于:保留date2为NULL,或者date2小于等于当前时间的记录,排除date2非空且大于当前时间的记录。
最终查询代码如下:
$db->query("SELECT * FROM tbl_transaction WHERE user_id='XXXX' AND (date2 IS NULL OR date2 <= NOW())");
如果只需要返回date字段而非全表字段,可以把*替换为你需要的字段列表,比如:
$db->query("SELECT id, date, 其他所需字段 FROM tbl_transaction WHERE user_id='XXXX' AND (date2 IS NULL OR date2 <= NOW())");
逻辑验证
我们可以用你给出的示例验证:
示例:
date=01/01/2020,date2=01/01/2022
假设当前时间早于2022年1月1日,那么date2 > NOW()成立,且date2非空,这条记录会被过滤,符合你的要求。
如果date2为NULL,或者当前时间晚等于2022年1月1日,这条记录会被正常返回,符合要求。
内容的提问来源于stack exchange,提问作者cypherpunk
相关产品推荐
相关产品推荐

