наткнулся случайно на похожую тему... Не подкинете хорошую идею, как из таблицы в миллион и более записей выбрать случайные 10? Буду очень благодарен! У меня есть несколько решений... но у всех есть заметные недостатки :о(
Я уже писал про этот метод в другой теме.. .. значение rand не присутствует в таблице - соответственно перед сортировкой оно будет добавлено для каждой записи.. а лимитом можно ограничить только кол-во выводимых записей, количество же записей которое выужден будет обработать сервак от этого не изменится..
PHP: <?php $i=0; for ($i++; --$i<10; $i+=2) { $sql = 'SELECT * FROM table WHERE id = '.rand(1000000); $result = mysql_query($sql); if(mysql_num_rows() == 0) { $i--; continue;} $row = mysql_fetch_row($result); $massiv[] = $row['pole']; } ?>
да.. Спасибо большое что не прошли стороной..)) у меня в вообще то что то похожее... просто много уже полей уделено.. а будет еще больше.. цикл может быть очень долгим :о(
у меня на одном портале работает такой код: PHP: <?php for($i=0;$i<3;$i++) { $sql = 'SELECT * FROM phpbb_games LIMIT '.rand(0, $all).', 1'; $result = $db->sql_query($sql); $ranrow = $db->sql_fetchrow($result); $ranout .= " <tr><td align='center'><a href = '/game.php?id=$ranrow[id]'><img border=0 src = '$pic_prefix$ranrow[image]' width=120 /></a></td></tr> <tr><td align='center'><a href = '/game.php?id=$ranrow[id]'>$ranrow[game]</a></td></tr>"; } ?>
Длинный лимит сильно тормозит. А вот если выбираются, скажем, анекдоты, и совсем не обязательно, чтобы они все шли в разнобой, то запрос можно очень упростить.
Можно что нить в этом роде подюзать: PHP: <? define("K",2); $limit=10; function get_n_random_nums($n, $min, $max){ for($i=0; $i<$n; $i++) $nums[]=round(rand($min,$max)); return $nums; } $sql="select min(id) as minid, max(id)as maxid, ".K." * (count(id) / (max(id) - min(id))) as num_of_rand FROM table"; $r=mysql_query($sql); if($r){ $row=mysql_fetch_assoc($r); $newlimit=ceil($row["num_of_rand"]*$limit); $rn=array(); while(1){ $rn=array_merge($rn, get_n_random_nums($newlimit, $row["minid"], $row["maxid"])); $rn=array_unique($rn); $in_ids=implode(",",$rn); $sql="SELECT * FROM table WHERE id IN (".$in_ids.")"; $r=mysql_query($sql); if(mysql_num_rows()>=10) break; } while($row=mysql_fetch_assoc($r)){ // Делаем что-то с полученными данными } }else{ mysql_error($link); } ?> Можно думаю подшлейфовать кое-где.... Но это Вы уж сами..... Не оставлять же вас без работы совсем......
Чебурген а ты перечитай, протестируй на табличке в миллион записей и отпиши рез-тат.... Тем более здесь я скорее открываю глаза на алгоритм..... Код этот можно и даже нужно ещё корректировать....
перечитал. так и не увидел принципиальных отличий от, я повторюсь - предыдущего кода svk. Если не считать косяков, которые надо "подшлейфовать".
Чебурген Перечитай ещё раз, проанализируй.... Пойми как работает его вар-т и мой, протестируй на табличке в миллион значений с дырками в столбце id...... И отпиши потом рез-тат.... Может отшлейфуешь заодно код...... Можешь предложить лучше - давай кусок кода....
если ты имеешь в виду жёсткий предел в 1000000, то это это точно такой же субьъект шлифовки. принципиально же, это такой же подход, как у тебя - тыкать пальцем в небо, пока не наберётся нудное число непустых айдишников у него больше запросов, у тебя - они сложнее. если ты считаешь, что твой способ кардинально отличается - ты и тестируй. А тестировать ни один из предложенных здесь вариантов я не собираюсь. поскольку все они кривые. просто исходя из самой постановки задачи. Если передо мной встанет подобная задача, буду решать её не "в лоб", а с умом.
Чебурген ну вот задача..... реши с умом..... мы не умеем.... нас в школе научили только в лоб решать..... Кусок кода в студию.... берем таблицу >=1000000 рядов
Никакой задачи я здесь не вижу. А только высосанный из пальца пример. Ты, наверное, не понял. Речь идёт о реальной задаче.
Чебурген Ну покажи нам как надо решать реальные задачи..... Мы умеем только примеры из пальца высасывать.....
Это всё не реальная задача. А уже готовые решения. Я тебе поясню разницу. Реальная задача - пойти в гости в чистых носках. Решение - постирать. Причём в отсутствие воды. Если хочешь - ломай голову над этим готовым решением. А я пойду, и куплю носки в магазине. Понятно, что я имею в виду? Я не представляю себе реальную задачу, при которой надо выбирать 10 случайных идущих вразнобой записей обязательно из всего миллиона. И жду, что ты мне напишешь реальную задачу, в которой может понадобиться что-то подобное. И я тебе моментально дам решение, при котором выборка из миллиона не понадобится.