MariaDB查询生产表最新生产数量异常,返回最大值而非目标值
解决方法:获取指定产品的最新生产数量
你的问题根源在于原查询没有正确定位到最新日期的生产记录,同时因为缺少GROUP BY子句,聚合函数SUM()导致数据库返回了任意一条匹配记录的production_qty(刚好是表中第一条40003的数值545)。
方案1:仅获取最新生产数量与产品基础信息
如果你只需要最新的生产数量,用子查询先找到该产品的最新生产日期,再匹配对应记录:
SELECT p.product_id, p.product_unit, pr.production_qty AS latest_production_qty FROM products p JOIN production pr ON p.product_id = pr.prod_id WHERE pr.prod_id = 40003 AND pr.production_date = ( -- 子查询获取prod_id=40003的最新生产日期 SELECT MAX(production_date) FROM production WHERE prod_id = 40003 AND production_date < CURRENT_DATE );
这个查询会返回你预期的latest_production_qty=7,同时关联产品的product_id和product_unit。
方案2:同时保留总生产数量(prod_in_hand)
如果需要同时展示总生产数量总和和最新生产数量,可以用子查询计算总和:
SELECT p.product_id, p.product_unit, pr.production_qty AS latest_production_qty, -- 子查询计算该产品的总生产数量 (SELECT SUM(production_qty) FROM production WHERE prod_id = 40003 AND production_date < CURRENT_DATE) AS prod_in_hand FROM products p JOIN production pr ON p.product_id = pr.prod_id WHERE pr.prod_id = 40003 AND pr.production_date = ( SELECT MAX(production_date) FROM production WHERE prod_id = 40003 AND production_date < CURRENT_DATE );
或者用MariaDB 10.3支持的窗口函数,写法更简洁:
SELECT DISTINCT p.product_id, p.product_unit, -- 按日期倒序取第一条生产数量 FIRST_VALUE(pr.production_qty) OVER (PARTITION BY pr.prod_id ORDER BY pr.production_date DESC) AS latest_production_qty, -- 计算该产品的总生产数量 SUM(pr.production_qty) OVER (PARTITION BY pr.prod_id) AS prod_in_hand FROM products p JOIN production pr ON p.product_id = pr.prod_id WHERE pr.prod_id = 40003 AND pr.production_date < CURRENT_DATE;
原查询的问题说明
- 缺少GROUP BY:当你使用
SUM()这类聚合函数时,必须用GROUP BY指定分组字段,否则数据库会返回分组中的任意一条记录的非聚合字段值(这里就是第一条40003记录的545)。 - 未筛选最新日期:原查询没有限定只获取最新生产日期的记录,所以无法定位到你要的那条数值为7的记录。
内容的提问来源于stack exchange,提问作者Muhammad Sameer
相关产品推荐
相关产品推荐

