SELECT查询返回NULL:如何获取指定条件下最新日期的数据库数据
解决思路与修正方案
首先帮你指出原SQL里的一个小语法错误:你写的SELECT * FROM WHERE Prize多了一个多余的WHERE,正确的开头应该是SELECT * FROM Prize。
接下来针对你的需求——优先返回今日录入的数据,今日无数据则返回昨日数据——给你两种可行的解决方案:
方案一:用UNION ALL + EXISTS条件判断
这个方案逻辑直观,先尝试获取今日数据,当今日无数据时再返回昨日数据:
-- 先返回今日符合条件的数据 SELECT * FROM Prize WHERE idLoteria = ? AND idHerary = ? AND dataPremio = CURRENT_DATE() UNION ALL -- 仅当今日无数据时,返回昨日符合条件的数据 SELECT * FROM Prize WHERE idLoteria = ? AND idHerary = ? AND dataPremio = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) AND NOT EXISTS ( SELECT 1 FROM Prize WHERE idLoteria = ? AND idHerary = ? AND dataPremio = CURRENT_DATE() )
注意:如果你的dataPremio是带时间的DATETIME类型,需要把dataPremio = CURRENT_DATE()改成DATE(dataPremio) = CURRENT_DATE(),确保忽略时间部分只匹配日期。
方案二:通过子查询确定目标日期
先动态计算要查询的目标日期(优先今日,无数据则取昨日),再关联查询对应日期的数据:
SELECT p.* FROM Prize p JOIN ( SELECT -- 先检查今日是否有数据,有则用今日,否则用昨日 COALESCE( (SELECT dataPremio FROM Prize WHERE idLoteria = ? AND idHerary = ? AND dataPremio = CURRENT_DATE() LIMIT 1), DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) ) AS target_date ) d ON p.dataPremio = d.target_date WHERE p.idLoteria = ? AND p.idHerary = ?
同样,如果dataPremio包含时间,记得把dataPremio = CURRENT_DATE()替换为DATE(dataPremio) = CURRENT_DATE()。
另外,如果你的场景中存在“昨日也无数据”的情况,需要返回最近日期的数据,可以调整方案二的子查询,直接取最大的日期:
SELECT p.* FROM Prize p JOIN ( SELECT MAX(dataPremio) AS target_date FROM Prize WHERE idLoteria = ? AND idHerary = ? ) d ON p.dataPremio = d.target_date WHERE p.idLoteria = ? AND p.idHerary = ?
这个版本会直接返回符合条件的最新日期的所有数据,不管是今日、昨日还是更早的日期,可能更通用。
内容的提问来源于stack exchange,提问作者Luccas Freitas
相关产品推荐
相关产品推荐

