在 mysql 中使用 limit 和 offset 进行分页时,如何判断这是不是最后一页?

when using limit and offset in mysql for pagination, how can I tell this is last page or not?

是否有任何内置的预定义mysql方法来检查具有限制偏移量的查询结果是否是最后一页?我找到了一些使用 sql_calc_found_rows 和 found_rows() 的建议,但它需要两个不同的查询,尽管我需要更简单直接的方法。

最终,我现在正在使用 FastAPI 和 SqlAlchemy,我想要类似 spring 数据 jpa、Pageable 方法“isFirst()”和“isLast()”的等价物。有什么优雅的方法可以使用 FastAPI 和 SqlAlchemy 来实现这两种方法吗?

我知道 Flast-SqlAlchemy 支持 hasNext() 布尔返回方法,但我想普通的 SqlAlchemy 不支持。

我以前用过的一个技巧是得到比你需要的多 1 个结果,然后用它来确定是否有更多。你不会知道最后一页的偏移量,但你会知道当前偏移量是否是最后一页。

例如,如果您的 page_count 大约有 10 个结果,则发送的限制为 11。然后如果你得到 10 个或更少的结果你知道这是最后一页但是如果你得到 11 你知道还有另一页并且你显示 10 并丢弃第 11 个结果。

Python伪代码

def get_page_of_results(current_offset, PAGE_COUNT=10):
    results = session.query(Result).offset(current_offset).limit(PAGE_COUNT + 1).all()
    return dict(
        is_first=current_offset == 0,
        is_last=len(results) < PAGE_COUNT,
        next_offset=current_offset + PAGE_COUNT,
        # Trim off last result
        results=results[:PAGE_COUNT])

10 到 11 之间的性能应该不是什么大问题,除非你正在加载巨大的对象树或其他东西。

此外,此方法与数据库无关。