php - 为 10000 多条记录分配随机顺序

标签 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 数字数组可能存在问题。

最佳答案

问题:

您确定使用了正确的日期格式吗?

为什么要随机化开始日期?将日期视为固定数字,就像您所做的那样(在本例中为 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

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

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

Example

但是,不管这对你有用还是没用……似乎没有必要。

希望这有帮助。

关于php - 为 10000 多条记录分配随机顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195065/

相关文章:

javascript - 在cakePHP 2.*中动态添加验证规则

cakephp - 如何在 cakephp 中设置默认时区?

php - 如何从 CodeIgniter 中的模型加载助手?

php - 清除密码而不是更新密码/重置密码

PHP Doctrine 在从模式生成数据库时将枚举转换为 varchar?

php - 删除具有相似名称的数据库重复项

php - Twitter API - 显示多个指定用户的最新推文

php - MySQL UNION 查询列名上的唯一标识符

php - 从数据库中选择内容时mysql自动删除斜杠?

cakephp - CakePHP-如何在模型中使用onError