根据 min(sort_order) 获取数据

Fetch the data based on min(sort_order)

我有一个 table 产品,里面有很多图片。

产品

id name
1  Sofa
2  Bed

图片

id product_id  image_url sort_order
1  1           "url5"    521
2  1           "url1"    200
3  1           "url1"    100
4  2           "url1"    1
5  2           "url2"    2

我想获取图像,其中 sort_order 对 100 种产品具有最小值,如下所示:

id  product_id  image_url  sort_order
3   1           "url1"     100
4   2           "url1"     1  

我知道我需要对图像使用 min(sort_order),但找不到正确的语法。 我正在尝试以下。但运气不好

select i.*
from images i
join product p on p.id = i.product_id
where p.id in (1, 2, ....)
  and i.sort_order = min(sort_order)

对构建正确的查询有什么帮助吗?

为什么你需要使用 min ??如果我错了请纠正我,但你说你需要 sort_order = 1 的图像,所以你只需要更改你的位置并添加限制。 WHERE i.sort_order = 1 LIMIT 100

这是非常糟糕的代码,但也许它会让您了解如何执行此操作。

select p.id,p.name,*
From product p
inner join (
 select i.product_id, min(sort_order) as minSortOrder 
 from images i 
 group by i.product_id
) i on i.product_id = p.id
inner join images ii on ii.product_id = p.id and ii.sort_order = i.minSortOrder

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=ccae44d199f9c9ac0edf4b75dd1b973b

编辑:另一种方法是创建按 Sort_Order 排序的 row_number,因此 Row_number = 1 将始终是最低的 Sort_order,然后我们将该查询包装在外部查询中以应用 where 子句

SELECT *
FROM (
    SELECT p.id
        ,p.name
        ,ii.image_url
        ,ii.sort_order
        ,row_number() OVER (
            PARTITION BY ii.product_id ORDER BY sort_order
            ) AS RowNumber
    FROM product p
    INNER JOIN images ii ON ii.product_id = p.id
    ) s
WHERE s.rownumber = 1

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=ca31c7650bc87174110bf9aa09b230d9

为每个产品的图片编号,并保持行编号为 1。

select id, product_id, image_url, sort_order
from
(
  select
    i.*,
    row_number() over (partition by product_id order by sort_order) as rn
  from images i
) numbered
where rn = 1;

另一种方法是查询 table 两次:

select *
from images
where (product_id, sort_order) in
(
  select product_id, min(sort_order)
  from images
  group by product_id
);