根据 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
);
我有一个 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
);