我正在尝试将定义的随机顺序分配给超过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数组数组的问题。
答案 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
按日期对记录进行排序,每次增加1。现在,如果你想使用应用程序ID作弊:
select *,
date_add('2011-12-13 00:00:00', interval id second) as newOrder
from table1
order by newOrder
然而,这对你来说是否有用......似乎没必要。
希望这有帮助。
答案 1 :(得分:0)
我认为你有一种奇怪的方式来做到这一点。您能告诉我们您使用的是哪种类型的数据库吗?像mysql这样的一些数据库支持随机命令,所以你不需要做所有这些以获得随机顺序...
在MySql中就像这样
SELECT * FROM tbl_name ORDER BY RAND();
另外我会听juhana评论,使用整数比使用日期更容易和更好,你可以使用bigint,如果你要有一个huuuuuge数量的记录......
如果您的数据库支持随机顺序,那么我会首先尝试查看,以便您减少工作量:D
希望这可以帮助你:D