首页 > 解决方案 > Postgres 中的左连接分页

问题描述

概括:

我在需要显示客户端的数据库中有数据。到目前为止,它还没有被分页,但现在数据已经增长到明显减慢连接速度的程度。所以我想分页。

设置:

问题

在此处输入图像描述

我有 3 个表,表 [A,B,C]。表 A 与表 B 和 C 有一对多的关系。所以当我进行类似的查询时

select * from A left join B on a.id = b.tableidb left join C on a.id = c.tableidc

在此处输入图像描述

我会得到 7 行,这很好。这是我真正想要的所有数据。当我们尝试分页时,问题就真的来了

select * from A left join B on a.id = b.tableidb left join C on a.id = c.tableidc limit 5 offset 0

在此处输入图像描述

如您所见,它实际上只带回了 5 行。但是,由于左连接,我们没有得到完整的数据集。

预期解决方案

我想说的是“在偏移量 0 处从表 A 中给我 5 行,然后在表 B 和 C 上左连接”

有没有办法在 postgres 中做到这一点?

标签: postgresql

解决方案


您可以在FROM子句中使用子选择。

您所要做的就是限制那里的行数:

SELECT *
FROM (SELECT * FROM A
      ORDER BY a.id
      LIMIT 5) AS al
   LEFT JOIN b ON al.id = b.tableidb
   LEFT JOIN c on al.id = c.tableidc;

笔记:

  1. 不使用LIMIT没有ORDER BY多大意义。

  2. 如果您考虑分页,请不要使用LIMITand OFFSET

    相反,请记住a.id您第一次选择的最后一个并查询。WHERE a.id > previous_a_id LIMIT 5


推荐阅读