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

MariaDB主查询字段在子查询中使用报错,求获取最低价对应店铺方案

解决SQL查询未知列错误并实现产品最低价格及对应店铺查询

你的SQL报错是因为子查询中引用了主查询聚合生成的minPriceCol,但SQL执行顺序里子查询会先于主查询的聚合计算,此时minPriceCol还未生成,所以会提示未知列。下面提供两种可行的解决方案:

方法一:使用窗口函数(MySQL 8.0+适用)

利用ROW_NUMBER()窗口函数按产品编码分组,按价格升序排序,直接获取每组中价格最低的记录:

SELECT 
    `Code` AS '产品编码',
    `wholesaler` AS '店铺名称',
    `minPriceCol` AS '最低价格'
FROM (
    SELECT 
        `Code`,
        `wholesaler`,
        ROUND(`Price`, 2) AS `minPriceCol`,
        ROW_NUMBER() OVER (PARTITION BY `Code` ORDER BY ROUND(`Price`, 2) ASC) AS `rank_num`
    FROM `Listings_Lines`
    WHERE `wholesaler` <> 'Pharmacon' AND `Price` > 0
) AS ranked_data
WHERE `rank_num` = 1;
  • 逻辑:先给每个产品的所有符合条件的记录按价格排序并标记序号,最后筛选序号为1的记录,就是该产品价格最低的那条,同时能拿到对应的店铺名称。

方法二:先计算最低价格再关联原表

先通过子查询算出每个产品的最低价格,再关联原表匹配对应价格的店铺信息:

SELECT 
    ll.`Code` AS '产品编码',
    ll.`wholesaler` AS '店铺名称',
    mp.`minPriceCol` AS '最低价格'
FROM (
    SELECT 
        `Code`,
        MIN(ROUND(`Price`, 2)) AS `minPriceCol`
    FROM `Listings_Lines`
    WHERE `wholesaler` <> 'Pharmacon' AND `Price` > 0
    GROUP BY `Code`
) AS mp
INNER JOIN `Listings_Lines` AS ll 
    ON mp.`Code` = ll.`Code` 
    AND mp.`minPriceCol` = ROUND(ll.`Price`, 2)
WHERE ll.`wholesaler` <> 'Pharmacon' AND ll.`Price` > 0;
  • 逻辑:先得到每个产品的最低价格,再回到原表找到价格等于该最低值的记录,从而获取对应的店铺名称。

注意事项

如果同一个产品有多个店铺的价格相同且均为最低:

  • 方法一使用ROW_NUMBER()会随机返回其中一条记录;若要返回所有符合条件的店铺,可将ROW_NUMBER()替换为RANK()。
  • 方法二会返回所有价格等于最低值的店铺记录。

内容的提问来源于stack exchange,提问作者Jason Ronne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:27:17