postgresql 使用连接和where子句进行分页

wfypjpf4  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(166)

问题

想象一下,有一张table装满了文章。每篇文章都有一个作者,并且可以有许多标签。
当获取这些文章时,应该有标签+作者。
这是通过在articles表上连接标签和作者来实现的。

SELECT *
FROM article
LEFT JOIN tag ON article.id = tag.article_id

但是现在我想实现分页。

我所尝试的

SELECT *
FROM article
LEFT JOIN tag ON article.id = tag.article_id
LIMIT 7

但是现在,如果我有一篇文章有6个标签,一篇有3个标签,那该怎么办?我得到的一篇文章有所有6个标签,但另一篇文章只有一个标签。
我读了一些博客文章,因为我被卡住了。
当我限制行时,我会丢失数据。
现在我读到做单独的请求。但首先,我只想做一个查询,更重要的是,我想过滤我的查询。例如:返回所有带有特定标签的文章,但使用分页。

SELECT *
FROM article
LEFT JOIN tag ON article.id = tag.article_id
WHERE tag.name = "TV Show"
LIMIT 7
hzbexzde

hzbexzde1#

由于您需要与文章相关的标签的完整信息,您需要分两步完成:
1.查询所需页面使用您的过滤器的文章列表.就像

SELECT *
FROM article a
WHERE EXISTS (
  SELECT 1
  FROM tag t
  WHERE a.id = t.article_id
  and t.name = :p_tag)
AND a.name like '%'||:p_article_name||'%'
ORDER BY a.publish_date
LIMIT 7

1.从步骤1中选择项目的标签列表。类似于:

SELECT *
FROM tag t
WHERE t.article_id in (:p1, :p2, :p3, :p4, :p5, :p6, :p7)

其中:pN是相应的文章id。
或者,您可以在单个查询中执行此操作,并结合这两个步骤:

WITH articles_page(
  SELECT *
  FROM article a
  WHERE EXISTS (
    SELECT 1
    FROM tag t
    WHERE a.id = t.article_id
    and t.name = :p_tag)
  AND a.name like '%'||:p_article_name||'%'
  ORDER BY a.publish_date
  LIMIT 7 
)
select * 
from articles_page a
left join tags t
on (a.id = t.article_id)

但恕我直言,这不是最好的选择,因为您需要在应用程序端聚合此数据集。

相关问题