Делает отбор поддержки SQLite RANDOM()
функционируйте тот же способ, с которым делает MySQL RAND()
?
$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;";
От MySQL Manual о RAND(N)
:
Если постоянный целочисленный аргумент N указан, он используется в качестве значения семени, которое производит повторяемую последовательность значений столбцов. В следующем примере обратите внимание, что последовательности значений, произведенных РЭНДОМ (3), являются теми же обоими местами, где он происходит.
В противном случае там какой-либо путь состоит в том, чтобы заархивировать тот же эффект с помощью только одного запроса?
Если вам нужен псевдослучайный порядок, вы можете сделать что-то вроде этого (PHP):
$seed = md5(mt_rand());
$prng = ('0.' . str_replace(array('0', 'a', 'b', 'c', 'd', 'e', 'f'), array('7', '3', '1', '5', '9', '8', '4'), $seed )) * 1;
$query = 'SELECT id, name FROM table ORDER BY (substr(id * ' . $prng . ', length(id) + 2)';
Кроме того, вы можете установить $seed на предопределенное значение и всегда получать одинаковые результаты.
Я научился этому приему у своего коллеги http://steamcooker.blogspot.com/
Взгляните на функцию sqlite3_randomness()
:
SQLite содержит высококачественный генератор псевдослучайных чисел (PRNG), используемый для выбора случайных ROWID при вставке новых записей в таблицу, которая уже использует максимально возможный ROWID. ГПСЧ также используется для встроенных функций SQL random() и randomblob().
...
При первом вызове этой рутины (либо внутренне, либо посредством приложения) ГПСЧ посылается , используя случайность, полученную из метода xRandomness объекта sqlite3_vfs по умолчанию. При всех последующих вызовах псевдослучайность генерируется внутренне и без обращения к методу sqlite3_vfs xRandomness.
Глядя на источник этого метода xRandomness
, видно, что он читается из /dev/urandom
на Unix. В Windows он просто возвращает возвращаемые значения некоторых временных функций. Так что, похоже, единственный вариант - это начать взлом исходного кода SQLite.