You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:36:21