如何为MySQL中关联的price表记录批量更新ordNum序号?
为关联的price表按article分组设置ordNum的单行语句方案
一、MySQL 8.0及以上版本(推荐)
利用MySQL 8.0新增的窗口函数ROW_NUMBER(),可以轻松实现按article_id分组为每条price记录编号,同时支持自定义排序规则:
基础版(不指定排序,按数据库默认顺序编号)
UPDATE price p JOIN ( SELECT id, ROW_NUMBER() OVER(PARTITION BY article_id) AS rn FROM price ) AS temp ON p.id = temp.id SET p.ordNum = temp.rn;
带排序版(例如按金额升序排序后编号)
如果需要按价格金额排序后编号,只需在OVER()子句中添加ORDER BY。注意amount是VARCHAR类型,需先转为数值类型避免排序错误:
UPDATE price p JOIN ( SELECT id, ROW_NUMBER() OVER(PARTITION BY article_id ORDER BY CAST(amount AS DECIMAL) ASC) AS rn FROM price ) AS temp ON p.id = temp.id SET p.ordNum = temp.rn;
二、MySQL 5.7及以下版本(无窗口函数)
通过用户变量实现分组计数,需处理变量初始化和分组切换逻辑:
UPDATE price p JOIN ( SELECT id, @row_num := IF(@current_article = article_id, @row_num + 1, 1) AS rn, @current_article := article_id FROM price, (SELECT @row_num := 0, @current_article := NULL) AS init -- 可选:添加ORDER BY指定排序规则,例如 ORDER BY article_id, amount ASC ) AS temp ON p.id = temp.id SET p.ordNum = temp.rn;
注:若需排序,在子查询末尾添加
ORDER BY子句即可确保分组内记录按预期顺序编号。
补充说明
虽然问题涉及两个关联表,但核心逻辑是对price表按article_id(关联article表的外键)分组编号,无需直接关联article表即可完成操作——price表的article_id已建立与article表的关联,分组时直接使用该字段即可对应到每个article的price记录。
内容的提问来源于stack exchange,提问作者user1034461
相关产品推荐
相关产品推荐

