SQL分组查询实现无重复ISBN并获取对应最低价格记录的方法
你原有SQL的问题在于,GROUP BY isbn后直接SELECT *不符合SQL执行逻辑,只能随机取每个ISBN分组下的任意一条记录,无法保证取到价格最低的条目,且分组后再排序的逻辑也不解决分组内取最小值的需求。
要保留你用到的OR筛选条件,可按以下两种方案实现:
方案1:支持窗口函数的数据库(MySQL8.0+、PostgreSQL、SQL Server等适用)
SELECT isbn, price, supplier FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY isbn ORDER BY price ASC) AS rank_num FROM `table` WHERE isbn = 4000 OR isbn = 4001 OR isbn = 4003 ) AS temp_table WHERE rank_num = 1;
说明:内层查询保留了你原有OR筛选逻辑,用PARTITION BY isbn按ISBN分组,每组内按价格升序排序后给行号,行号为1的就是该ISBN价格最低的记录。如果同一ISBN有多条相同最低价格的记录需要全部返回,把ROW_NUMBER替换为RANK()即可。
方案2:兼容低版本MySQL的写法
SELECT t1.* FROM `table` t1 INNER JOIN ( SELECT isbn, MIN(price) AS lowest_price FROM `table` WHERE isbn = 4000 OR isbn = 4001 OR isbn = 4003 GROUP BY isbn ) t2 ON t1.isbn = t2.isbn AND t1.price = t2.lowest_price;
说明:先通过子查询拿到每个ISBN的最低价格,再关联原表匹配对应完整记录,内层WHERE条件保留了你原有OR的写法,符合你的要求。
按你提供的示例数据,两种方案最终返回的结果均为:
| isbn | price | supplier |
|---|---|---|
| 4000 | 19.99 | companyB |
| 4001 | 33.50 | companyA |
| 4003 | 11.99 | companyB |
内容的提问来源于stack exchange,提问作者Jurgen
相关产品推荐
相关产品推荐

