You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:04