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


Assign Random Order to 10000+ records

我正在尝试为一个包含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数字数组可能存在问题。

问题:

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

为什么开始日期要随机化?将日期作为一个固定的数字,就像你所做的那样(在这种情况下是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

示例

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

希望这能有所帮助。

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

在MySql中就是这样的

SELECT * FROM tbl_name ORDER BY RAND();

此外,我将听取juhana的评论,使用整数比使用日期更容易、更好,如果你要有大量的记录,你可以使用bigint。。。

尽管如此,我还是会先看看你的数据库是否支持随机顺序,这样你就可以减少工作量:D

希望这能帮助你:D