Php 将随机顺序分配给10000+;记录

Php 将随机顺序分配给10000+;记录,php,mysql,cakephp,Php,Mysql,Cakephp,我正在尝试将定义的随机顺序分配给一个包含10000多条记录的表。我有一个函数,它利用一个开始日期,在每个连续的日期上添加1秒,随机分配。然后我可以按随机指定的日期进行排序。我的函数在有50条记录时运行良好,但在有10000多条记录时失败 它为大约9000条记录设置了正确的日期,但1146条记录被指定为0(1969-12-31 19:00:00)。任何获得此项或类似工作的帮助都将不胜感激 function randomize(){ $count = $this->Application-

我正在尝试将定义的随机顺序分配给一个包含10000多条记录的表。我有一个函数,它利用一个开始日期,在每个连续的日期上添加1秒,随机分配。然后我可以按随机指定的日期进行排序。我的函数在有50条记录时运行良好,但在有10000多条记录时失败

它为大约9000条记录设置了正确的日期,但1146条记录被指定为0(1969-12-31 19:00:00)。任何获得此项或类似工作的帮助都将不胜感激

function randomize(){
  $count = $this->Application->find('count');
  $order = range(0, $count-1); // Array of numbers 0 to count-1
  $startDate = strtotime('December 13, 2011 0:00:00');
  shuffle($order); // scramble array of numbers
  $Applications = $this->Application->find('all');
  set_time_limit(0);
  foreach($Applications as $app){
    $this->Application->id = $app['Application']['id'];
    $this->Application->saveField('order', date('Y-m-d H:i:s', $startDate + $order[$this->Application->id]));
  }
  set_time_limit(30);
}

更新:我正在使用MySQL数据库,但需要一个永久状态进行1次随机化,而不是按照RAND()的顺序重复随机化。我还更新了代码(见上文)以减少开销,并将php.ini中的内存从128M增加到了256M。随着代码的更改,坏日期不再是0,而是与$startDate相同,这表明$order数组中的数字可能存在问题。

我认为您有一种奇怪的方法。您能告诉我们您使用的是哪种类型的数据库吗?像mysql这样的一些数据库支持随机排序,所以您不需要做所有这些来获得随机排序

在MySql中是这样的

SELECT * FROM tbl_name ORDER BY RAND();
此外,我将听取juhana的评论,使用整数比使用日期更容易、更好,如果您要有大量记录,可以使用bigint

不过,我还是会首先尝试看看您的数据库是否支持随机顺序,以便减少工作量:D

希望这对您有所帮助:D

问题:

你确定你用的是正确的日期格式吗

为什么要随机选择开始日期?将日期作为一个固定的数字,就像你正在做的那样(本例中为X):如果你对每条记录执行
X+givenOrderNumber
,那么顺序将由
givenOrderNumber
定义。。。那么,为什么要添加不必要的内容呢

我了解您在这里寻找的问题:

set @num = 0;
select *,
  date_add('2011-12-13 00:00:00', interval @num := @num + 1 second) as newOrder
from table1
order by newOrder

它按日期对记录进行排序,每次递增一个日期。现在,如果要使用应用程序id欺骗:

select *,
  date_add('2011-12-13 00:00:00', interval id second) as newOrder
from table1
order by newOrder

然而,无论这对你是否有用。。。这似乎没有必要


希望这能有所帮助。

我不太清楚为什么要使用datetime字段来订购记录。为什么不使用递增整数呢?这是数据所有者要求的。我不知道为什么这是他们想要的,但这是他们想要的。顺便说一句,您应该能够通过在
find
方法中只返回
id
来进一步优化这一点。你没有使用其他任何东西,所以没有必要把它全部包含进去。当我使用MySQL时,每次随机选择都是唯一的。我需要对记录顺序进行一次性随机化,设置为永久状态,这就是我将其存储到字段中的原因。@Naidim:哦,我明白了,这是真的。我没有看到你的代码有任何错误。但您可以尝试使用mt_rand()生成一个int,并将该int用作每个日期的时间,这将为您提供一个随机顺序,即使其中两个日期相同,数据库也会选择第一个:)是的,日期格式正确,适用于10570条记录中的9324条。感谢SQL,我可以根据需要修改它。设置@num=0;更新
应用程序
设置
顺序
=日期添加('2011-12-13 00:00:00',间隔@num:=@num+1秒)按兰德顺序()