You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助: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=36id_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

火山引擎 最新活动