在我最近的一个基于 PHP(CodeIgniter)的项目中,一个 MySQL 表包含近 30.000 条记录(并且还会增加更多)。如果我将这些记录显示为列表,则性能会降低(MySQL可以在短时间内检索所有这些记录,但是运行大约30.000次的PHP循环是不可行的)。因此,我的计划是一次加载 100 条记录并创建分页,以便用户可以选择一个页码来加载指定数量的记录。
我可以使用以下查询轻松加载前 100 条记录:
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100
但问题是:当我选择page=2, page=3, ...., page=n
.如何编写将加载第 2 条 100 条记录(对于 page=2)、第 3 个 100 条记录(对于 page=3)的 MySQL 查询,... ...第 n 条记录 100 条(对于页面 = n)?
注意:请参考 101 号码记录可能没有 ID 101,类似的 201 号码记录可能没有 id 201,所以请不要向我建议一个依赖于主键的查询
谁能帮我找出正确的查询?
- 谢谢
前一百
个SELECT * FROM <table_name> ORDER BY id ASC LIMIT 0, 100
下一个一百
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100, 100
你非常善于把订单放进去
限制语句解释:LIMIT
语句不是WHERE
子句。它不按id
选择,也不按任何标准进行选择,(where
子句这样做)相反,limit
子句只是确保返回作为"一切"子集的block
结果的一部分。因此,为什么每次都提到一个order by
很重要,这样每个后续调用都会按顺序为您提供正确的数据块,并且您可以通过它们"下一个"、"下一个"、"下一个">
EG:对于无序表this_table
:
+-------+-------------+
| id | value |
+-------+-------------+
| 1 | bob |
| 12 | fish |
| 112 | pink |
| 2 | cat |
| 8 | dog |
| 56 | blue |
| 88 | grey |
| 87 | red |
+-------+-------------+
选择返回如下:
SELECT * FROM <this_table> ORDER BY id ASC LIMIT 0,5
+-------+-------------+
| id | value |
+-------+-------------+
| 1 | bob |
| 2 | cat |
| 8 | dog |
| 12 | fish |
| 56 | blue |
+-------+-------------+
和
SELECT * FROM <this_table> ORDER BY id ASC LIMIT 5,5
+-------+-------------+
| id | value |
+-------+-------------+
| 87 | red |
| 88 | grey |
| 112 | pink |
+-------+-------------+
请注意缺少第 9 行和第 10 行,这是故意的,表明 MySQL 按预期工作
顺便说一下,您还应该考虑添加一个索引id
这将大大提高这些选择的速度
ALTER TABLE <table_name> ADD INDEX `id` (`id`)
试试这个
SELECT * FROM <table_name> ORDER BY id ASC LIMIT <p * 100>, 100
所以你必须有
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 0, 100
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100, 100
如果第一页 = 0,则工作,否则,您需要 (P-1) * 100
https://www.w3schools.com/php/php_mysql_select_limit.asp