MySQL脚本触发Error #1241问题排查及定时价格查询需求咨询
实现按ID数组获取有效价格的MySQL脚本
针对你需要按给定ID数组获取对应价格、每个ID仅返回一条记录,同时支持定时价格更新(仅选取时间戳≤当前UTC时间的价格)的需求,我完善并格式化了MySQL脚本如下:
完整SQL脚本
SELECT `wo_id`, `price2_currency`, `price2`, `formula_id` FROM ( SELECT `product_pricing`.`wo_id`, `product_pricing`.`currency` AS price2_currency, `product_pricing`.`price` AS price2, `product_pricing`.`formula_id`, `product_pricing`.`timestamp`, -- 假设表中存在记录价格生效时间的字段 -- 按产品ID分组,给符合时间条件的记录按时间倒序排名 ROW_NUMBER() OVER ( PARTITION BY `product_pricing`.`wo_id` ORDER BY `product_pricing`.`timestamp` DESC ) AS row_num FROM `product_pricing` -- 筛选已生效的价格(时间戳≤当前UTC时间) WHERE `product_pricing`.`timestamp` <= UTC_TIMESTAMP() -- 指定要查询的目标ID数组,可替换为实际业务中的ID集合 AND `product_pricing`.`wo_id` IN ('WO001', 'WO002', 'WO003') ) AS ranked_prices -- 仅保留每个ID的第一条记录(最新的有效价格) WHERE row_num = 1;
关键逻辑说明
- 定时生效控制:通过
WHERE timestamp <= UTC_TIMESTAMP()确保只返回当前时间及之前已生效的价格,完美支持提前录入未来时间的价格,到点自动生效的定时更新需求。 - 单ID唯一记录:使用
ROW_NUMBER()窗口函数按wo_id分组,按时间戳倒序排序,这样每个ID组内最新的有效价格会被标记为row_num=1,最终只取这一条记录。 - 动态ID数组:脚本中的
IN ('WO001', 'WO002', 'WO003')可以替换为实际需要查询的ID集合,也可以结合应用层的参数化查询动态传入ID列表,适配不同业务场景。
如果你的需求是获取每个ID最早生效的有效价格,只需将窗口函数中的ORDER BY timestamp DESC改为ORDER BY timestamp ASC即可。
内容的提问来源于stack exchange,提问作者Nkk
相关产品推荐
相关产品推荐

