【问题标题】:Solution Mysql Random query migrate when goto another page解决方法 Mysql Random query migrate when goto another page
【发布时间】:2016-09-15 17:07:35
【问题描述】:

我有表 Post,用户可以通过关键字查找来搜索 Post。

所以,我通过like 关键字和RAND() 的顺序使用SQL 查询。 当显示结果时,我使用 GridView 和分页数据。并且有问题,当转到另一个页面时。第 1 页的示例使用相同的关键字转到第 2 页。我将再次查询并按 Rand() 排序。所以第 1 页中的一些数据可以出现在第 2 页中。 该数据重复且不好。

那么我该如何解决这个问题。转到其他页面时的数据查询与第一次查询中的数据相同。

我在项目中使用 Yii2。

【问题讨论】:

  • 好吧,您将查询限制为(例如)20 个结果并使用ORDER BY RAND(),对吗?但是在 MySQL 中,ORDERLIMIT 之前应用,所以你总是得到随机结果然后你限制它们,这就是为什么它们中的一些出现在其他页面中的原因。顺便说一句,为什么需要使用RAND()?当您想使用页面获得结果时,不建议这样做。
  • 是的,客户端需要随机数据。并要求查询所有数据。我找到了随机项目的解决方案。我没有随机使用mysql。查询数据时,我不使用随机数,当向用户显示结果时将由 php 随机数。以及何时再次访问。我将在第一页随机使用相同的规则。所以我不知道具有相同结果的随机数组的确切 php 函数(按某些条件添加)

标签: php mysql


【解决方案1】:

好的,我想我明白了。 MySQL 查询示例:

SELECT * FROM articles WHERE name LIKE '%tag%' LIMIT 0, 20;

或者你可以用MySQL的MATCH()代替LIKE,没关系。然后LIMIT 0, 20 是限制,第一页显示多少个结果。第二页应该是LIMIT 1, 20。这个你知道我除了。然后你在 PHP 中得到一个结果数组,并且想要得到随机值。 PHP 为您提供了这样一个功能,它被称为 suffle()

所以您只需使用shuffle($results);,然后您可以使用 foreach 或任何您用来打印数据的工具来打印它们。注意shuffle() 返回布尔值,所以不要使用$results = shuffle($results);。希望这会有所帮助。

【讨论】:

  • 那个解决方案,不在mysql中使用rand()。所以有问题,客户端需要选择所有数据和随机。正如您的建议,一些数据(从 0 -> 20 的 id )总是首先出现。那么第 N 项需要如何首先出现呢?并且具有相同结果的随机数组的 PHP 函数?示例随机首页与下一页相同。
  • 那么这可能是不可能的,因为访问新页面将发送一个新查询。当您使用RAND() 时,您总会遇到问题中的问题。一种解决方案是从第一页保存 ID,然后从另一个查询中禁用它们,这是非常非常错误的解决方案。另一个可以捕获所有结果并使用 JavaScript 进行分页,但这会对性能产生巨大影响,结果很多。
  • 是的,我认为不可能。所以我有关于缓存数据的解决方案。当第一个访问页面时,我查询数据并存储缓存并使用 key 分配,然后访问另一个页面,我将发送密钥并从缓存中接收数据。
  • 是的,没错,就是这样,但请记住,缓存大量数据会降低您的网站速度。
  • 是的,我使用文件缓存,并且每天都有删除缓存的 cron 作业。
猜你喜欢
  • 2016-03-17
  • 2015-09-20
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多