Назначить случайный заказ на 10000+ записей - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь назначить определенный случайный порядок таблице из более чем 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 с 128 до 256 миллионов.При изменении кода недопустимые даты больше не равны 0, а совпадают с $ startDate, что указывает на проблему с массивом чисел $ order.

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Вопросы:

Вы уверены, что используете там правильный формат даты?

Зачем начинать случайную дату?Возьмите дату как фиксированное число, как вы делаете (в данном случае 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

Пример

Сортирует записи по дате, котораяувеличивается на единицу каждый раз.Теперь, если вы хотите использовать чит-код приложения:

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

Пример

Однако, полезно это вам или нет ... похоже,не нужно.

Надеюсь, это поможет.

0 голосов
/ 08 февраля 2012

Я думаю, у вас есть странный способ сделать это. Можете ли вы сказать нам, какой тип базы данных вы используете? Некоторые базы данных, такие как mysql, поддерживают случайный порядок, поэтому вам не нужно делать все это, чтобы получить случайный порядок ...

В MySql это так

SELECT * FROM tbl_name ORDER BY RAND();

Также я выслушаю комментарий джуханы: использовать целые числа проще и лучше, чем с датами, вы можете использовать bigint, если у вас будет огромное количество записей ...

Тем не менее, я бы сначала попытался проверить, поддерживает ли ваша база данных случайный порядок, поэтому вы выполняете меньше работы: D

Надеюсь, это поможет вам: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...