考虑这种分页场景
ID | 姓名 | 姓 |
---|---|---|
1个 | 米奇 | 老鼠 |
2个 | 唐纳德 | 鸭子 |
3个 | 守财奴 | 麦当劳 |
4个 | 密涅瓦 | 老鼠 |
5个 | 高飞 | 狗 |
6个 | 雏菊 | 鸭子 |
SELECT * FROM users
ORDER BY id DESC
LIMIT 3;
结果集将是
ID | 姓名 | 姓 |
---|---|---|
6个 | 雏菊 | 鸭子 |
5个 | 高飞 | 狗 |
4个 | 密涅瓦 | 老鼠 |
从 SQL 的角度来看它可能有意义,但从人类的角度来看就没有什么意义了。毕竟,查询的意思是“给我倒序排列的三页中的第一页”。“第一页”显然是表的前三行,而不是最后三行,因此执行该查询的人为方式会导致
ID | 姓名 | 姓 |
---|---|---|
3个 | 守财奴 | 麦当劳 |
2个 | 唐纳德 | 鸭子 |
1个 | 米奇 | 老鼠 |
另一方面,原始结果集更适合这个查询,“给我倒序排列的三页中的第二页”
SELECT * FROM users
ORDER BY id DESC
LIMIT 3
OFFSET 3;
你能让 Postgres在andORDER BY
之后执行吗?OFFSET
LIMIT
您可以将其包装到子查询中以显示具有不同排序顺序的结果:
也就是说,
LIMIT
&OFFSET
不能很好地扩展分页。如果您的桌子不是特别小,请考虑更聪明的方法。看: