如何结合SELECT DISTINCT使用SET?实现商品表最低价商品标记更新
解决每个pn最低价商品的flag更新问题
没问题,这事儿完全可以用UPDATE语句结合子查询或者表关联来实现,我给你分享几种靠谱的写法,你可以根据自己的场景选:
方法一:UPDATE + JOIN(推荐,效率更高)
这种方式先通过子查询算出每个pn对应的最低价,再把原表和这个子查询结果关联,匹配上pn和price的行就更新flag:
UPDATE `test` t JOIN ( -- 先算出每个pn的最低价 SELECT pn, MIN(price) AS min_price FROM `test` GROUP BY pn ) AS sub_query ON t.pn = sub_query.pn AND t.price = sub_query.min_price SET t.flag = '1';
如果同一个pn下有多个商品都是最低价(比如不同company的商品价格相同),这个语句会把所有符合条件的行的flag都设为1,完全符合需求。
方法二:UPDATE + 关联子查询
也可以用EXISTS子查询来筛选需要更新的行:
UPDATE `test` t SET flag = '1' WHERE EXISTS ( SELECT 1 FROM ( SELECT pn, MIN(price) AS min_price FROM `test` GROUP BY pn ) AS sub_query WHERE t.pn = sub_query.pn AND t.price = sub_query.min_price );
或者更简洁的单条子查询写法(适合小表,大表可能效率稍低):
UPDATE `test` t SET flag = '1' WHERE t.price = ( -- 对当前行的pn,找到对应的最低价 SELECT MIN(price) FROM `test` WHERE pn = t.pn );
注意事项
- 执行更新前,建议先把
UPDATE换成SELECT *跑一遍,确认要更新的行是正确的,避免误操作。比如用方法一的查询语句:SELECT * FROM `test` t JOIN ( SELECT pn, MIN(price) AS min_price FROM `test` GROUP BY pn ) AS sub_query ON t.pn = sub_query.pn AND t.price = sub_query.min_price; - 如果你的表数据量很大,给
pn字段加个索引能大幅提升子查询/关联的效率。
内容的提问来源于stack exchange,提问作者Tikky
相关产品推荐
相关产品推荐

