如何从关联数据库查询各商品的最低单价?
解决每个已上架商品最低单价的SQL问题
嘿,这个问题很典型!你现在的SQL只返回一条结果,根源在于没对商品做分组——当你用MIN()这类聚合函数但没指定GROUP BY时,数据库会把所有匹配的行当成一个整体,自然只会算出全局的最低价,而不是每个商品自己的最低价。
方法一:用GROUP BY分组计算(最直接)
只需要给原SQL加上GROUP BY子句,指定按商品的唯一标识(id)和名称(product)分组,这样数据库就会为每个单独的商品计算最低单价:
SELECT a.id AS id_product, a.product, MIN(b.price) AS price FROM tb_product a JOIN tb_product_store b ON b.id_product = a.id WHERE a.active = 1 GROUP BY a.id, a.product -- 核心:按商品维度分组,确保每个商品单独计算最低价 ORDER BY a.product;
执行这条SQL后,就能得到你预期的结果:每个已上架商品对应自己的最低单价。
方法二:用窗口函数(适合扩展需求)
如果之后你需要额外显示最低价对应的店铺信息,或者处理同商品多个店铺同价的场景,可以用窗口函数ROW_NUMBER()(或RANK())来实现:
WITH product_price_ranking AS ( SELECT a.id AS id_product, a.product, b.price, -- 按商品分组,给每个商品的价格按从低到高排序 ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY b.price ASC) AS price_rank FROM tb_product a JOIN tb_product_store b ON b.id_product = a.id WHERE a.active = 1 ) -- 只取每个商品的最低价(排名第一的记录) SELECT id_product, product, price FROM product_price_ranking WHERE price_rank = 1 ORDER BY product;
小提示:如果同一个商品有多个店铺的价格都是最低价,用
RANK()会返回所有同价的记录,而ROW_NUMBER()只会随机取其中一条,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者celsomtrindade
相关产品推荐
相关产品推荐

