从多行只返回一个数据

Posted

技术标签:

【中文标题】从多行只返回一个数据【英文标题】: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

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

提前谢谢你。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于从多行只返回一个数据的主要内容,如果未能解决你的问题,请参考以下文章

Google 表格:从 IMPORTDATA() 中拆分多行分隔文本

使用 AVG 时返回多行

如何使用 pgAdmin 4.2 获取从 PG/PLSQL 中的函数返回的整个表数据或多行。

如何使用此函数从 mysql 和 PHP 获取多行

从递归存储过程返回多行

Arrayformula 返回多行中的最后一个非空单元格