PostgreSQL连接另一个表的第一个结果

ogsagwnx  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(2)|浏览(114)

我有以下表格:

文章:

| id (pk) | title   |
|---------|---------|
| 1       | title 1 |
| 2       | title 2 |

图片:

| id (pk) | post_id (fk) | display_order | image_path |
|---------|--------------|---------------|------------|
| 1       | 1            | 1             | image1.jpg |
| 2       | 1            | 2             | image2.jpg |
| 3       | 1            | 0             | image3.jpg |
| 4       | 2            | 1             | image4.jpg |
| 5       | 2            | 1             | image5.jpg |
| 6       | 2            | 2             | image6.jpg |

我想检索一个帖子列表,每个帖子包含基于display_order的图像中的第一个项目。
所需的结果如下所示:

| id | title   | thumb_path |
|----|---------|------------|
| 1  | title 1 | image3.jpg |
| 2  | title 2 | image4.jpg |

我该怎么做?

e5nszbig

e5nszbig1#

一个 * 经典 * 的PostgreSQL解决方案是distinct on子句。

select distinct on (post_id) post_id, image_path
from images 
order by post_id, display_order, image_path

每个post_id的 * 第一 * 行是用order by定义的
剩下的就是简单的join

with img as (
select distinct on (post_id) post_id, image_path
from images 
order by post_id, display_order, image_path
)
select p.id, p.title, img.image_path
from posts p
join img on p.id = img.post_id
zzoitvuj

zzoitvuj2#

使用横向联接只能获取相关表中的一行。例如:

select p.*, x.image_path
from posts p
left join lateral (
  select *
  from images i where i.post_id = p.id
  order by display_order
  limit 1
) x on true

相关问题