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

如何在MySQL中获取近7天记录,无数据日期返回0?求解决方案

解决MySQL查询近7天记录(无数据返回0)的问题

你的思路是想用UNION补全日期,但这种方式存在逻辑漏洞:当某天存在真实数据时,UNION进来的0会和真实数据一起被分组,这时候MySQL要么在ONLY_FULL_GROUP_BY模式下直接报错,要么随机返回真实值或0,完全不符合预期。

下面给你两种可靠的解决方案,适配不同版本的MySQL:

方案一:MySQL 8.0及以上(支持递归CTE)

用递归CTE生成连续的7天日期序列,再左连接业务表,最后用COALESCE把空值替换为0。这种写法简洁易维护:

WITH date_range AS (
    -- 起始日期为今天
    SELECT CURDATE() AS record_date
    UNION ALL
    -- 递归生成前6天的日期
    SELECT DATE_SUB(record_date, INTERVAL 1 DAY)
    FROM date_range
    WHERE record_date > DATE_SUB(CURDATE(), INTERVAL 6 DAY)
)
SELECT
    DATE_FORMAT(d.record_date, '%a') AS Pdate,
    -- 如果当天无数据,COALESCE会把null转为0;这里用SUM是假设某天可能有多条记录,你可以换成MAX/MIN等符合业务需求的聚合函数
    COALESCE(SUM(p.patient_blood_sugar_Pre_fasting), 0) AS patient_blood_sugar_Pre_fasting
FROM date_range d
-- 左连接业务表,注意把datetime类型转成date,避免时间部分干扰匹配
LEFT JOIN patient_blood_sugar_record p
    ON d.record_date = DATE(p.patient_blood_sugar_record_date)
GROUP BY d.record_date
ORDER BY d.record_date;

方案二:MySQL 5.x及以下(不支持CTE)

如果你的MySQL版本不支持递归CTE,可以直接用UNION ALL手动生成7天日期,逻辑和上面一致:

SELECT
    DATE_FORMAT(d.record_date, '%a') AS Pdate,
    COALESCE(SUM(p.patient_blood_sugar_Pre_fasting), 0) AS patient_blood_sugar_Pre_fasting
FROM (
    SELECT CURDATE() AS record_date
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY)
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 2 DAY)
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 3 DAY)
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 4 DAY)
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 5 DAY)
    UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 6 DAY)
) d
LEFT JOIN patient_blood_sugar_record p
    ON d.record_date = DATE(p.patient_blood_sugar_record_date)
GROUP BY d.record_date
ORDER BY d.record_date;

额外说明

  • 如果你的业务场景是每天只有一条记录,可以把SUM换成MAX/MIN,或者直接用子查询取当天的唯一值:
    COALESCE(
        (SELECT patient_blood_sugar_Pre_fasting 
         FROM patient_blood_sugar_record 
         WHERE DATE(patient_blood_sugar_record_date) = d.record_date 
         LIMIT 1), 
        0
    )
    
  • 务必确保日期匹配时,把patient_blood_sugar_record_date(如果是datetime类型)转成date,否则会因为时分秒的差异导致连接失败。

内容的提问来源于stack exchange,提问作者Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:20:09