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

如何编写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;

这个方法会返回所有价格等于最低价格的行,如果有多个同价的最低行,都会被保留。

原查询的错误点说明

你的原查询里有两个问题:

  1. 字段名笔误:你写了min(cp.final_price),但你的表结构里是price字段,应该改成min(cp.price)。
  2. GROUP BY用法不规范:在标准SQL中,SELECT列表里的非聚合列(比如cp.*里的price、code)必须出现在GROUP BY中,或者被聚合函数包裹。有些数据库允许不规范的写法,但会返回分组内的任意一行,而不是和min(price)对应的行,这就是为什么你拿到的是第一个匹配行而不是最低价格的行。

备注:内容来源于stack exchange,提问作者Rakesh Jesadiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:13:06