Выпекаем сайты, находим покупателей

Оптимальный запрос случайных записей из MYSQL

Есть множество вариантов замены медленного RAND() при выборе случайных записей, опишу свой.

1. Выбор одной записи

//Узнаём кол-во записей в таблице
$st=mysql_result(mysql_query("SELECT MAX(`id`) FROM `bash`"),0);
//Генерируем число от 1_го до максимального кол-ва записей.
$st=mt_rand(1,$st);
//Выбираем запись с id равным рандомному числу
$ls=mysql_fetch_array(mysql_query("SELECT * FROM `bash` WHERE `id`='{$st}'"));

Данный пример подходит если ваша таблица имеет числовое поле id. В другом случае, можно использовать этот код:

$st=mysql_result(mysql_query("SELECT COUNT(*) FROM `bash`"),0);
$st=mt_rand(1,$st);
$ls=mysql_fetch_array(mysql_query("SELECT * FROM `bash` LIMIT {$st},1"));
2. Выбор нескольких записей

//Узнаём кол-во записей в таблице
$trow=mysql_result(mysql_query("SELECT COUNT(`id`) FROM `bash`"),0);
$q=array();
//Кол-во случайных записей
while(count($q) < 10) { $row=mt_rand(1,$st); $q[] = "(SELECT * FROM `bash` WHERE `id`='{$row}')"; } //Объединяем запросы с помощью UNION $q=implode(' UNION ', $q); $q = mysql_query($q);

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

$trow=mysql_result(mysql_query("SELECT COUNT(`id`) FROM `bash`"),0);
$q=array();$i=array();
while(count($q) < 10) {
	$row=mt_rand(1,$st);
	foreach($i as $i2){if($i2==$row){$row=mt_rand(1,$st);continue;}else{break;}}
	$q[] = "(SELECT * FROM `bash` WHERE `id`='{$row}')";
}
$q=implode(' UNION ', $q);
$q = mysql_query($q);


P.S. Данные примеры я писал основываясь на том, что в таблице нету дыр (удалённых записей). Для лучшего эффекта используйте пример с полем id.

Комментарии и отзывы к материалу

Открыта вакансия на первого комментатора!

Отправить комментарий

Как зовут?

Сообщение