Я кое-как составил запрос(гугл), но не знаю какой нужен алгоритм для выборки скажем 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`'); |
Да, ты прав. Но одно дело 1 запись, другое 10 - я не знаю что делать.
Цитата |
и ещё... я не пойму, почему у меня смайлы не отображаются?))) |
У меня как видишь тоже. :D
Спустя 6 минут, 51 секунда (31.08.2012 - 22:15) Ramzes_Ra написал(а):
innovate
10 записей?)) пфф...
в примере уже 3 разные выборки)) и так до десяти..
понимаешь, суть в том, для чего тебе нужны эти записи.. и исходя из цели делаешь код..
можно в одном запросе выбрать все
это не совсем так оформляется, но для понимания проще именно так показать..
можно ещё через цикл do while сделать, но кроме меня его почему-то никто не любит.. хотя по простоте и функционалу он расширяет границы возможностей.. но это сугубо моё мнение
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); |
Так фишка в том, что бы записи не совпадали, а в тот код что ты предложил могут попасть записи с тем же 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
№2
Интереснее всего то, что второй вариант создан для "ускорения запроса". Я решил проверить:
Выборка 1-ой записи:
№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....
- Вариант 1: 0.0014....
- Вариант 2: 0.0020....
- Вариант 1: 0.0021....
- Вариант 2: 0.1178....
- Вариант 1: 0.034134
- Вариант 2: 0.449552
- Тип таблицы: MyISAM
- Кол-во строк : 227
- Кол-во полей: 20
Какой вариант лучше? Не понимаю.
Спустя 12 минут, 39 секунд (1.09.2012 - 14:47) innovate написал(а):
Цитата |
Если без ORDER BY RAND, то забивать в массив числа, которые уже были. Как-то так, не проверяла: $already_found = array(); |
Код рабочий, но не выводит нужное кол-во записей, т.к. скрипт 10 раз вытягивает записи под случайным id, а если запись под тем же id уже вытянута, то одна из 10 попыток уходит зря => скажем надо вытянуть 50 записей, а увижу я 15/41/39 и тд. (Я так себе это представляю);
Спустя 2 минуты, 28 секунд (1.09.2012 - 14:50) innovate написал(а):
Лена, твой вариант самый быстрый.