摘要:
我的数据库中有数据,需要在客户端显示。到现在为止还没有分页,但是现在数据已经增长到明显降低连接速度的地步。所以我想分页。
设置:
问题:
我有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行。但是,由于存在左联接,因此无法获得完整的数据集。
期望的解决方案
我想说的是“从表A给我5行偏移量为0的行,然后在表B和C上左联接”的结果。
在postgres中有办法吗?
答案 0 :(得分:5)
您可以在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;
注释:
在没有LIMIT
的情况下使用ORDER BY
没有多大意义。
如果考虑分页,请不要使用LIMIT
和OFFSET
。
相反,请记住您第一次选择的最后一个a.id
并查询WHERE a.id > previous_a_id LIMIT 5
。