如何基于min(sort_order)查询每个产品对应最小排序值的图片记录
错误原因分析
你编写的语句无法执行的核心原因是:聚合函数MIN()不能直接在WHERE子句中使用。WHERE子句的执行时机早于分组、聚合计算,此时还没有统计出每个产品对应的最小sort_order值,因此无法直接对比。
实现方案
方案1:窗口函数实现(推荐,兼容MySQL 8.0+、PostgreSQL、SQL Server等所有支持窗口函数的数据库)
SELECT t.id, t.product_id, t.image_url, t.sort_order FROM ( SELECT i.*, -- 按产品ID分组,分组内按sort_order升序排序,排序第一位就是最小sort_order的记录 ROW_NUMBER() OVER (PARTITION BY i.product_id ORDER BY i.sort_order ASC) AS rn FROM images i -- 替换括号内为你要查询的100个指定产品ID WHERE i.product_id IN (1,2) ) t WHERE t.rn = 1;
如果同一个产品存在多条相同最小sort_order的图片需要全部返回,将ROW_NUMBER()替换为RANK()即可。如果需要校验查询的产品ID在Product表中实际存在,可在子查询中添加JOIN Product p ON i.product_id = p.id的关联逻辑。
方案2:子查询关联实现(兼容所有数据库版本,包括低版本MySQL)
SELECT i.* FROM images i INNER JOIN ( -- 先统计每个指定产品的最小sort_order值 SELECT product_id, MIN(sort_order) AS min_sort FROM images WHERE product_id IN (1,2) GROUP BY product_id ) t ON i.product_id = t.product_id AND i.sort_order = t.min_sort WHERE i.product_id IN (1,2);
两种方案执行后都可以得到你预期的查询结果:
id product_id image_url sort_order 3 1 "url1" 100 4 2 "url1" 1
内容的提问来源于stack exchange,提问作者Chakreshwar Sharma
相关产品推荐
相关产品推荐

