【问题标题】:Return only one data from multiple row从多行只返回一个数据
【发布时间】:2021-03-30 05:48:39
【问题描述】:

我有 4 个表,分别称为 orders、order_details、products 和 storages。每个产品都可以有多个保存在存储表上的缩略图。

我想通过 id 返回特定订单,该订单返回多行 order_details,其中每个 order_details 只有一个产品。在每个产品中,我只想从 storages 表中获取一个缩略图。

如果我想获得 order_id = 1 的行,这就是我的想法,

SELECT * 
FROM orders o
JOIN order_details od ON o.id = od.order_id
JOIN products p ON p.id = od.product_id 
JOIN storages s ON s.product_id = p.id --> i haven't figured out how to return only one image for every product in order_details
WHERE o.id = 1

谁能帮帮我,我已经想了好几天了,但还是没弄好:(

提前谢谢你。

【问题讨论】:

    标签: sql postgresql inner-join greatest-n-per-group


    【解决方案1】:

    一个简单的方法是使用row_number():

    SELECT *
    FROM orders o JOIN
         order_details od
         ON o.id = od.order_id JOIN
         products p
         ON p.id = od.product_id JOIN
         (SELECT s.*,
                 ROW_NUMBER() OVER (PARTITION BY product_id ORDER by random()) as seqnum
          FROM storages s
         ) s
         ON s.product_id = p.id
    WHERE o.id = 1 AND seqnum = 1;
    

    这会返回一个随机图像。您可以替换 ORDER BY 以获取您想要的任何图像——最旧的、最新的、最大的、最小的等等。

    【讨论】:

      【解决方案2】:

      我还没有弄清楚如何在 order_details 中为每个产品只返回一张图片

      在 Postgres 中,我会推荐 distinct on:

      select distinct on (o.id, od.product_id) *
      from orders o
      join order_details od on o.id = od.order_id
      join products p on p.id = od.product_id
      join storages s on s.product_id = p.id 
      order by o.id, od.product_id, s.id
      

      这保证每个订单和产品只有一行,存储空间最小为id。如果愿意,您可以使用 where 子句过滤给定的订单 ID。

      或者您可能想使用订单详细信息的主键而不是产品(这允许同一订单的两个不同订单详细信息中有两次相同的产品)。

      select distinct on (o.id, od.id) *
      from orders o
      join order_details od on o.id = od.order_id
      join products p on p.id = od.product_id
      join storages s on s.product_id = p.id 
      order by o.id, od.id, s.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 2014-12-14
        • 2021-09-18
        • 1970-01-01
        相关资源
        最近更新 更多