MySQL按日期分组统计收入异常:为何未按日聚合返回总计?
问题分析与修正方案
你的查询出现两个关键问题,导致无法按日期分组统计每日收入:
1. GROUP BY 子句的语法错误
你在 FROM_UNIXTIME("created_at") 里用双引号包裹了列名 created_at,在SQL语法中双引号通常用来表示字符串常量,而非列名。这就导致 DATE(FROM_UNIXTIME("created_at")) 被解析成一个固定的字符串值,所有符合条件的行都会被归为同一组,自然只能得到一个总计结果。
2. SELECT 子句的逻辑错误
你直接在SELECT里返回了原始的 created_at 列,但这个列既没有用聚合函数处理(比如MAX/MIN),也没有出现在GROUP BY子句中(在MySQL严格模式下这会直接报错)。数据库会随机返回分组中某一行的时间戳,这显然不是你需要的每日日期。
修正后的查询语句
SELECT DATE(FROM_UNIXTIME(`created_at`)) AS date, SUM(income) AS daily_income FROM `incomes` WHERE `created_at` BETWEEN UNIX_TIMESTAMP(NOW() - INTERVAL 10 DAY) AND UNIX_TIMESTAMP(NOW()) GROUP BY DATE(FROM_UNIXTIME(`created_at`)) ORDER BY date;
关键修正点说明
- 把列名
created_at的双引号改成反引号(MySQL中如果列名无特殊字符,也可以直接去掉引号),确保数据库识别为列名而非字符串。 - SELECT子句中返回分组后的日期(
DATE(FROM_UNIXTIME(created_at)) AS date),替代原始时间戳,清晰展示每日对应的收入总和。 - 添加
ORDER BY date让结果按日期排序,更符合阅读习惯。
针对你的测试数据的预期结果
你的数据中,只有前3条记录在近10天范围内(最后一条时间戳1513267843对应2017-12-14,超出范围会被过滤):
- 1516182896 和 1516188513 都对应日期
2018-01-17,收入总和为300 + (-1050) = -750 - 1516444061 对应日期
2018-01-20,收入总和为2000
修正后的查询会返回:
date daily_income ------------------------ 2018-01-17 -750 2018-01-20 2000
内容的提问来源于stack exchange,提问作者deviloper
相关产品推荐
相关产品推荐

