如何从MySQL数据库中选择明智的N个记录?

时间:2018-04-06 13:49:03

标签: php mysql

在我最近的一个基于PHP(CodeIgniter)的项目中,MySQL表包含近30000条记录(并且会增加更多)。当我将这些记录显示为列表时,会降低性能(MySQL会在很短的时间内检索所有这些记录,但运行PHP循环大约30000次是不可行的)。所以我的计划是一次加载100条记录并创建一个分页,以便用户可以选择一个页码来加载指定数量的记录。

我可以使用以下查询轻松加载前100条记录:

SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100

但问题是:当我选择page = 2,page = 3,....,page = n时。如何编写一个MySQL查询,它将加载第二百条100条记录(页面= 2),第三条100条记录(页面= 3),......第100条记录(页面= n)?

NB:请参考101号码记录可能没有ID 101,类似的201号码记录可能没有201的ID,所以请不要建议我查询取决于主键

任何人都可以帮我找出正确的查询吗? - 谢谢

2 个答案:

答案 0 :(得分:3)

第一百个

sails.models.user

下一百

 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子句只是确保你返回{{1}的一部分结果是“一切”的子集。因此,为什么每次提到一个limit很重要,这样每个后续调用都会按顺序为您提供正确的数据块,并且您可以通过它们“下一步”,“下一步”,“下一步”

EG:对于无序表block

order by

选择返回如下:

this_table

+-------+-------------+
|  id   |   value     |
+-------+-------------+
|  1    |     bob     |
|  12   |     fish    |
|  112  |     pink    |
|  2    |     cat     |
|  8    |     dog     |
|  56   |     blue    |
|  88   |     grey    |
|  87   |     red     |
+-------+-------------+

注意缺少第9行和第10行这是故意的,并显示MySQL按预期工作

顺便说一下,您还应该考虑在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    |
+-------+-------------+

答案 1 :(得分:2)

试试这个

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