[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Случайные записи из базы по id.
innovate
Всем привет. Нужно составить запрос на выборку данных из базы где id равен случайному числу из промежутка.
Я кое-как составил запрос(гугл), но не знаю какой нужен алгоритм для выборки скажем 10 записей.(Был вариант скопипастить код
10 раз :) , но будут попадаться те же записи.) Подскажите саму идею и если не трудно, укажите "пальцем"" на глупые ошибки в коде.

$row_count = mysql_result(mysql_query('SELECT COUNT(*) FROM table;'), 0);
$int = rand(1, $row_count);
$result = mysql_query("SELECT * FROM table where id='$int'",$db);
if (!$result)
{
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("%s",$myrow["id"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
exit();
}




Спустя 11 минут, 15 секунд (31.08.2012 - 21:57) Ramzes_Ra написал(а):
Эээм... может быть начало лучше так написать? :rolleyes:
$result = mysql_query('SELECT COUNT(*) FROM `table`');
$row = mysql_fetch_row($result);
$row_count = $row[0];
$int = rand(1, $row_count);
$result = mysql_query("SELECT * FROM `table` where `id`='".$int."'",$db);


и ещё... я не пойму, почему у меня смайлы не отображаются?)))

Спустя 11 минут (31.08.2012 - 22:08) innovate написал(а):
Цитата
Эээм... может быть начало лучше так написать?

$result = mysql_query('SELECT COUNT(*) FROM `table`');
$row = mysql_fetch_row($result);
$row_count = $row[0];
$int      = rand(1, $row_count);
$result    = mysql_query("SELECT * FROM `table` where `id`='".$int."'",$db);


Да, ты прав. Но одно дело 1 запись, другое 10 - я не знаю что делать.

Цитата
и ещё... я не пойму, почему у меня смайлы не отображаются?)))
У меня как видишь тоже. :D


Спустя 6 минут, 51 секунда (31.08.2012 - 22:15) Ramzes_Ra написал(а):
innovate
10 записей?)) пфф...
$int       = rand(1, $row_count);
$result = mysql_query("SELECT * FROM `table` where `id`='$int'",$db);
$int = rand(1, $row_count);
$result1 = mysql_query("SELECT * FROM `table` where `id`='$int'",$db);
$int = rand(1, $row_count);
$result2 = mysql_query("SELECT * FROM `table` where `id`='$int'",$db);

в примере уже 3 разные выборки)) и так до десяти..
понимаешь, суть в том, для чего тебе нужны эти записи.. и исходя из цели делаешь код..
можно в одном запросе выбрать все

$int1 = rand(1, $row_count);
$int2 = rand(1, $row_count);
$int3 = rand(1, $row_count);
$result = mysql_query("SELECT * FROM `table` where `id`='$int1' OR `id`='$int2' OR `id`='$int3'",$db);


это не совсем так оформляется, но для понимания проще именно так показать..

можно ещё через цикл do while сделать, но кроме меня его почему-то никто не любит.. хотя по простоте и функционалу он расширяет границы возможностей.. но это сугубо моё мнение

Спустя 9 минут, 56 секунд (31.08.2012 - 22:25) innovate написал(а):
Цитата
$int       = rand(1, $row_count);
$result    = mysql_query("SELECT * FROM table where id='$int'",$db);
$int      = rand(1, $row_count);
$result1    = mysql_query("SELECT * FROM table where id='$int'",$db);
$int      = rand(1, $row_count);
$result2    = mysql_query("SELECT * FROM table where id='$int'",$db);


Так фишка в том, что бы записи не совпадали, а в тот код что ты предложил могут попасть записи с тем же id.

Цитата
понимаешь, суть в том, для чего тебе нужны эти записи.. и исходя из цели делаешь код..

Скажем существует пост/тема/заметка/.. неважно что, заметка/тема/.. расположена в базе под id 2 и в категории 5, так вот мне нужно вывести 10 случайных записей из таблицы где категория равна 5(т.е. к коду надо добавить ещё 1 условие). Главное что бы запрос выполнялся быстро.

Спустя 10 минут, 22 секунды (31.08.2012 - 22:35) Ramzes_Ra написал(а):
Цитата
Так фишка в том, что бы записи не совпадали

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

$int1 = rand(1, $row_count);
$int2 = rand(1, $row_count);
if($int2 == $int1)
{
while($int2 == $int1)
{
$int2 = rand(1, $row_count);
}
}

хотя можно и функцию написать.. кому как нравится)

Спустя 9 минут, 54 секунды (31.08.2012 - 22:45) Invis1ble написал(а):

Спустя 6 минут, 24 секунды (31.08.2012 - 22:51) Ramzes_Ra написал(а):
Цитата
http://hudson.su/2010/09/16/mysql-optimiza...-order-by-rand/

вообще абалденно

Спустя 39 минут, 34 секунды (31.08.2012 - 23:31) Лена написал(а):
Если без ORDER BY RAND, то забивать в массив числа, которые уже были.
Как-то так, не проверяла:

$already_found = array();
$number_rand_int = 10; //количество записей, которые надо выбрать
$int = 0;
$row_count = mysql_result(mysql_query('SELECT COUNT(*) FROM table;'), 0);

for($i=0;$i<$number_rand_int ;$i++)
{
$int = rand(1, $row_count);

if(!in_array($int,$already_found) && $int !== 0)
{
$already_found[] = $int;
$result = mysql_query("SELECT * FROM table where id='$int'",$db);
}else
continue
;
}

Спустя 15 часов, 3 минуты, 55 секунд (1.09.2012 - 14:35) innovate написал(а):
И так, есть два варианта:
№1
$result    = mysql_query("SELECT * FROM `table` ORDER BY RAND() LIMIt 10",$db);
if (!$result)
{
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<p>%s</p>",$myrow["id"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
exit();
}



№2
$row_count = mysql_result(mysql_query('SELECT COUNT(*) FROM table;'), 0);
$query = array();
while (count($query) < 10)
{
$query[] = '(SELECT * FROM table LIMIT '.rand(0, $row_count).', 1)';
}
$query = implode(' UNION ', $query);
$result = mysql_query($query);
if (!$result)
{
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<p>%s</p>",$myrow["id"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
exit();
}


Интереснее всего то, что второй вариант создан для "ускорения запроса". Я решил проверить:

Выборка 1-ой записи:
  • Вариант 1: 0.0013....
  • Вариант 2: 0.0014....
Выборка 10-ти записей:
  • Вариант 1: 0.0014....
  • Вариант 2: 0.0020....
Выборка 50-ти записей:
  • Вариант 1: 0.0021....
  • Вариант 2: 0.1178....
Выборка 2-ух сотен записей:
  • Вариант 1: 0.034134
  • Вариант 2: 0.449552
Таблица
  • Тип таблицы: MyISAM
  • Кол-во строк : 227
  • Кол-во полей: 20
Зачем создавать тему и обижать бедного аутсорсера, если вариант предложенный автором работает медленнее :angry: ! ( Возможно я что то не так понял, тогда укажите на ошибку.)

Какой вариант лучше? Не понимаю.



Спустя 12 минут, 39 секунд (1.09.2012 - 14:47) innovate написал(а):
Цитата
Если без ORDER BY RAND, то забивать в массив числа, которые уже были.
Как-то так, не проверяла:

$already_found = array();
$number_rand_int = 10; //количество записей, которые надо выбрать
$int = 0;
$row_count = mysql_result(mysql_query('SELECT COUNT(*) FROM table;'), 0);

for($i=0;$i<$number_rand_int ;$i++)
{
    $int = rand(1, $row_count);
   
    if(!in_array($int,$already_found) && $int !== 0)
    {
        $already_found[] = $int;
        $result = mysql_query("SELECT * FROM table where id='$int'",$db);
    }else
        continue
;
}


Код рабочий, но не выводит нужное кол-во записей, т.к. скрипт 10 раз вытягивает записи под случайным id, а если запись под тем же id уже вытянута, то одна из 10 попыток уходит зря => скажем надо вытянуть 50 записей, а увижу я 15/41/39 и тд. (Я так себе это представляю);

Спустя 2 минуты, 28 секунд (1.09.2012 - 14:50) innovate написал(а):
Лена, твой вариант самый быстрый. biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.