如何编写SQL查询获取每个商品对应的Catalog_Product_Price表最低价格完整记录
如何编写SQL查询获取每个商品对应的Catalog_Product_Price表最低价格完整记录
嗨,我来帮你解决这个问题!你的需求是给每个商品找到Catalog_Product_Price表里价格最低的那一行完整记录,对吧?你之前的查询之所以不符合预期,问题出在GROUP BY的用法上——当你用GROUP BY c.entity_id时,SELECT里的cp.*会返回分组内的任意一行(通常是数据库存储的第一条),而不是和min(cp.price)对应的那一行,所以才会拿到错误的结果。
下面给你两种靠谱的解决方案,你可以根据自己的数据库版本选择:
方法一:用窗口函数(推荐,适合现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用ROW_NUMBER()是最清晰直观的方式:
SELECT c.sku, cp.entity_id, cp.price, cp.code FROM Catalog_Product c JOIN ( SELECT *, -- 按entity_id分组,每组内按价格升序编号,价格最低的行编号为1 ROW_NUMBER() OVER (PARTITION BY entity_id ORDER BY price ASC) AS rn FROM Catalog_Product_Price ) cp ON c.entity_id = cp.entity_id -- 筛选出每组中编号为1的行(即最低价格的行) WHERE cp.rn = 1;
小提示:如果某个商品有多个价格相同的最低行,上面的方法只会返回其中一行;如果想保留所有同价的最低行,可以把ROW_NUMBER()换成RANK()。
方法二:用子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先通过子查询算出每个entity_id的最低价格,再关联原表找到对应的完整记录:
SELECT c.sku, cp.entity_id, cp.price, cp.code FROM Catalog_Product c JOIN Catalog_Product_Price cp ON c.entity_id = cp.entity_id -- 关联子查询,找到每个entity_id的最低价格 JOIN ( SELECT entity_id, MIN(price) AS min_price FROM Catalog_Product_Price GROUP BY entity_id ) min_prices ON cp.entity_id = min_prices.entity_id AND cp.price = min_prices.min_price;
这个方法会返回所有价格等于最低价格的行,如果有多个同价的最低行,都会被保留。
原查询的错误点说明
你的原查询里有两个问题:
- 字段名笔误:你写了
min(cp.final_price),但你的表结构里是price字段,应该改成min(cp.price)。 GROUP BY用法不规范:在标准SQL中,SELECT列表里的非聚合列(比如cp.*里的price、code)必须出现在GROUP BY中,或者被聚合函数包裹。有些数据库允许不规范的写法,但会返回分组内的任意一行,而不是和min(price)对应的行,这就是为什么你拿到的是第一个匹配行而不是最低价格的行。
备注:内容来源于stack exchange,提问作者Rakesh Jesadiya
相关产品推荐
相关产品推荐

