【问题标题】:PHP search results pagination without running the query multiple timesPHP搜索结果分页无需多次运行查询
【发布时间】:2013-11-11 21:38:58
【问题描述】:

我在网上搜索了如何在 PHP 中进行搜索结果分页,然后我看到了这样的帖子:http://php.about.com/od/phpwithmysql/ss/php_pagination.htm

每当询问不同页面的结果时,都会再次执行查询,而改变的是“限制”。

但是,如果我的数据库非常大,并且我想避免每次都搜索它(使用类似 select * from articles where HTML like '%dummy%' limit x, y 的东西)怎么办?

据我了解,数据库每次都会自行搜索,并会根据 xy 返回不同的结果。

【问题讨论】:

  • 将结果保存在$_SESSION?
  • 不,这确实解决了他的问题 :) 问题在于双重选择,而不是保存实际结果(这也不需要会话)

标签: php search mysqli pagination


【解决方案1】:

您根本无法通过一个查询(有效地)做到这一点,您总是需要一个来选择结果,一个来获取项目的总数。

有一种方法可以改进它,您只需要第二个查询中的行数:

// Query one, to select the actual content:
Select * from articles where HTML like '%dummy%' LIMIT $start,$num_items
// Query two, select an index column, preferable a small int column:
Select id from articles where HTML like '%dummy%' 

我一直在做一个网上商店,不是最大的数据库,而是 3500 种产品,有 1 到 N 个图像,1 到 N 个类和一些其他非常大的表(数量),而且效果很好 :)


如果需要,您可以在 1 个查询中完成。只需选择整组并让 PHP 跳过行直到到达 start 并在到达 limit 时中断循环。但是,这比再次运行查询需要更多的时间(和资源!)。如果您想提高速度,请确保您已将 html 列编入索引,这将节省大量时间。 记住,这个(mysql-)数据库是为快速搜索而设计的,php 不是


如果您有一个庞大的数据集,您可能希望一路改变策略。您可以计算行数并创建一个新表,您可以调用类似table_info 并添加一个名为number_of_rows_in_TABLENAME 的行并使用新插入更新它,然后减去其中一个删除一行,但是这种方法变得草率你真的很快忘记了一些东西

【讨论】:

  • sigh,如果您投反对票,请解释原因,以便我改进答案。
  • 我不是投反对票的人,但我真的不明白你的想法。为了显示我的页面,我唯一想要的是匹配搜索条件的总结果、结果本身以及我希望每页拥有的项目。我不明白为什么我应该执行 2 个查询,也看不到这如何回答我的问题:如何避免在用户选择的每个页面中再次运行查询(它将再次搜索数据库)?
  • 所以,如果我做对了,通过运行查询 No2,我的所有 id 都符合我的标准,所以当页面更改时,我将搜索包含所有匹配 id 的表并提取那些匹配当前页面?我在哪里保存此表以便在页面更改时可以访问它?另外,为什么不只运行查询 No2,然后从数据库中提取 ID(我不明白为什么甚至需要查询 No1。要在当前(第一个)搜索结果页面上显示项目?)
  • Q1 是选择页面上的项目,分页不需要。继续网上商店的例子,那是您选择产品信息的地方。 Q2 是总页数所需的。 Q1选择你要展示的东西,Q2选择项目的数量。
  • 我希望赞成票和反对票一样受到质疑。有时我真的想知道一个人的想法是什么原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
相关资源
最近更新 更多