помогите с рэндомом + выборка сбазы нескольких значений

Сенсей

Новичок
помогите с рэндомом + выборка сбазы нескольких значений

Задача - выбрать с базы некоторое количество записей в случайном порядке.

Выбрать одну случайную запись - не проблема .... а вот несолько - тут я уже бошку поломал над логикой ... вот до чего я пока что дешел :

$total = mysql_fetch_row(mysql_query("SELECT count(*) FROM buttons", $dbi));
$show = 2; // сколько записей показать
$rand_start = rand(1, ($total['0']-$show));
$rand_end = $rand_start+$show;
$result =mysql_query("SELECT code FROM buttons limit ".($rand_start).",".($rand_end)."", $dbi);
$content = "";
while(list($code) = mysql_fetch_row($result))
{
echo $code.'<br><br>';
}

При $show = 2; выводит то 2 записи ... то 3 .. то 3 ....
до некоторых записей вобще не доходит :(

Вобщем бред какой то .... я и логику вроде понимаю - но уже достало ... не получается заставить работать по человечески :(

можно конечно сделать

$result = mysql_query("SELECT code FROM buttons ORDER BY RAND() LIMIT ".$show."", $dbi);

но оно рэндомится странно ..... очнь част выдает одни и те же результаты один за одним .. + читал что оно медленно работает .. или я не прав ?
 

advocat

developer
Re: помогите с рэндомом + выборка сбазы нескольких значений

RAND()
RAND(N)
Возвращает случайную величину с плавающей точкой в диапазоне от 0 до 1,0. Если целочисленный аргумент N указан, то он используется как начальное значение этой величины:

Код:
mysql> SELECT RAND();
        -> 0.9233482386203

mysql> SELECT RAND(20);
        -> 0.15888261251047

mysql> SELECT RAND(20);
        -> 0.15888261251047

mysql> SELECT RAND();
        -> 0.63553050033332

mysql> SELECT RAND();
        -> 0.70100469486881
В выражениях вида ORDER BY не следует использовать столбец с величинами RAND(), поскольку применение оператора ORDER BY приведет к многократным вычислениям в этом столбце. В версии MySQL 3.23 можно, однако, выполнить следующий оператор: SELECT * FROM table_name ORDER BY RAND(): он полезен для получения случайного экземпляра из множества SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново. Оператор RAND() не следует воспринимать как полноценный генератор случайных чисел: это просто быстрый способ динамической генерации случайных чисел, переносимых между платформами для одной и той же версии MySQL.
http://dev.mysql.com/doc/mysql/ru/Mathematical_functions.html
 

Сенсей

Новичок
Именно по этому я и пишу собственный .... мне по нему помощь нужна - а не цитаты из мана мускула ...
 

zahhar

двинутый новичок
Всегда использовал ORDER BY RAND() LIMIT n и существенных косяков не наблюдал. Сколько записей в вашей таблице?
 

advocat

developer
есть канешно вариант сделать что-то типа твоего примера, только делается по другому

PHP:
$res = mysql_query("SELECT COUNT(*) FROM `tbl_name`");
$cnt = mysql_result($res, 0);

$cnt_rows = 2;

$result = mysql_query("SELECT * FROM `tbl_name` LIMIT ".rand(0,($cnt-$cnt_rows)).", ".$cnt_rows);
 
Сверху