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

时间:2012-02-08 14:19:05

标签: php mysql cakephp

我正在尝试将定义的随机顺序分配给超过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次随机化,而不是按照ORDER BY RAND()重复随机化。我还更新了代码(见上文)以减少开销,并将php.ini中的内存从128M增加到256M。随着代码更改,错误日期不再是0,而是与$ startDate相同,表明它可能是$ order数组数组的问题。

2 个答案:

答案 0 :(得分:1)

问题:

您确定在那里使用正确的日期格式吗?

为什么开始日期随机化?正如您所做的那样将日期作为固定数字(在这种情况下为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

Example

按日期对记录进行排序,每次增加1。现在,如果你想使用应用程序ID作弊:

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

Example

然而,这对你来说是否有用......似乎没必要。

希望这有帮助。

答案 1 :(得分:0)

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

在MySql中就像这样

SELECT * FROM tbl_name ORDER BY RAND();

另外我会听juhana评论,使用整数比使用日期更容易和更好,你可以使用bigint,如果你要有一个huuuuuge数量的记录......

如果您的数据库支持随机顺序,那么我会首先尝试查看,以便您减少工作量:D

希望这可以帮助你:D

相关问题