2017-02-11 19 views
1

我通过PHP脚本访问我的数据库表,并且有时会得到连续的重复结果。在PHP中更改RAND()函数的种子?

我跑这个查询:

$query ="SELECT Question,Answer1,Answer2 FROM MyTable ORDER BY RAND(UNIX_TIMESTAMP(NOW())) LIMIT 1"; 

此查询之前,我想只是ORDER BY RAND(),但它给了我很多的连续重复的结果,这就是为什么我决定使用ORDER BY RAND(UNIX_TIMESTAMP(NOW()))。 但这最后一个仍然给我不断重复的结果(但更少)。

我要去写一个例子来说明我的意思,当我说:“连续重复的结果”

形象地说,我在我的表100行:ROW1,ROW2,ROW3,ROW4,ROW5。 .. 很好,当我把我的脚本PHP 5倍时间可持续我得到5个结果: - ROW2,ROW20,ROW20,ROW50,ROW66

我不想同一行连续两次。 我想它,例如: - ROW2,ROW20,ROW50,ROW66,ROW20

我只是想解决它的一些简单的方法。

回答

0

https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand

RAND()并不意味着是一个完美的随机数发生器。这是一个快速的方式 产生随机数的需求,这是在同一个MySQL版本的 平台之间可移植的。

如果你想要5个结果,为什么不把限制改为5?这将确保没有重复

其他选项是读取所有的数据,然后在PHP中使用shuffle? http://php.net/manual/en/function.shuffle.php

或者选择最大和使用来自PHP

http://php.net/manual/en/function.mt-rand.php

0

这是不只是重新定义查询可行产生的随机数。您需要更改PHP脚本的逻辑。

如果你想使PHP脚本(和查询)返回每次执行的具体哪一行,你需要一个保证,重复执行的PHP scrips的产生不同的行,然后你需要存储先前的结果某处,并使用查询的WHERE条件中的以前的结果。

所以,你的PHP脚本变得像(伪):

$previousId = ...; // Load the ID of the row fetched by the previous execution 

$query = "SELECT Question,Answer1,Answer2 
     FROM MyTable 
     WHERE id <> ? 
     ORDER BY RAND(UNIX_TIMESTAMP(NOW())) 
     LIMIT 1"; 

// Execute $query, using the $previousId bound parameter value 

$newId = ...; // get the ID of the fetched row. 

// Save $newId for the next execution. 

您可以使用各种存储区中保存/载入获取的行ID。最简单的可能是为了这个目的,在同一个数据库中使用一行特殊的表格。


注意,你可能仍然得到如果你在并行调用PHP脚本中多次重复连续行。不知道在你的情况下是否重要。 如果是这样,您可以使用数据库事务来修复此问题。