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
相关产品推荐
相关产品推荐

