【问题标题】:Fetch the data based on min(sort_order)根据 min(sort_order) 获取数据
【发布时间】:2021-11-27 20:43:28
【问题描述】:

我有一张表Product,里面有很多图片。

产品

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)

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

【问题讨论】:

    标签: sql mysql-8.0


    【解决方案1】:

    为每个产品的图片编号并保持行编号为 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;
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 排序顺序可以从 1 或 1000 或其他数字开始,让我更新问题
      • 所以你只需要一个子查询,只需将 i.sort_oder = 1 更改为 i.sort_order = (select min(sort_order) from images) 不要忘记限制,你很高兴:)跨度>
      【解决方案3】:

      这是非常糟糕的代码,但也许它会让您了解如何做到这一点。

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2013-01-21
        • 2017-12-19
        • 2021-07-23
        • 1970-01-01
        • 2014-08-27
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多