求助:SQL获取指定报价(id_quote=36)对应最低价格的正确语句
解决SQL获取指定报价最低价格对应供应商的问题
嘿,我来帮你搞定这个SQL查询的问题!咱们先拆解你遇到的两个语句的问题,再给你靠谱的解决方案。
第一个语句的问题
你写的第一条语句存在语法错误——子查询的括号没有闭合,修正后的正确写法是:
SELECT * FROM price WHERE price=(SELECT MIN(price) as price FROM price WHERE id_quote=36);
你说的没错,如果有多个供应商的价格等于最低值,这条语句会返回所有符合的记录,这是正常逻辑,但得先把语法问题解决掉。
第二个语句的问题
第二条语句SELECT id_provider, MIN(price) as price FROM price WHERE id_quote=36结果不正确的核心原因是MySQL的非标准行为:当你在SELECT中同时包含非聚合列(比如id_provider)和聚合函数(比如MIN(price)),但没有使用GROUP BY时,数据库会随机返回一条匹配id_quote=36的id_provider,而不是对应最低价格的那个供应商ID。这种写法不符合SQL标准,结果完全不可靠。
正确的解决方案
下面给你几种实用的写法,按需选择:
方法1:返回所有最低价格的供应商记录
如果需要保留所有报价36且价格最低的供应商(包括多个价格相同的情况),用这个写法:
SELECT id_provider, price FROM price WHERE id_quote = 36 AND price = (SELECT MIN(price) FROM price WHERE id_quote = 36);
逻辑清晰且符合SQL标准,子查询先找到最低价格,外层再匹配所有对应记录。
方法2:用窗口函数(MySQL 8.0+适用)
如果只需要返回一条最低价格的记录(或者多条的话调整函数),可以用窗口函数,完全不需要分组:
SELECT id_provider, price FROM ( SELECT id_provider, price, -- 按报价分组,价格升序排序,给每条记录编号 ROW_NUMBER() OVER (PARTITION BY id_quote ORDER BY price ASC) AS rn FROM price WHERE id_quote = 36 ) AS sub_query WHERE rn = 1;
如果想保留所有价格最低的记录,把ROW_NUMBER()换成RANK()即可。
方法3:用LIMIT快速获取单条记录
如果确定只有一个供应商有最低价格,或者只需要任意一条最低价格的记录,这个写法最简单:
SELECT id_provider, price FROM price WHERE id_quote = 36 ORDER BY price ASC LIMIT 1;
内容的提问来源于stack exchange,提问作者Philippe Winter




