从多行只返回一个数据
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() 中拆分多行分隔文本