Вы не зашли.
Главная » SQL » выбрать 10 случайных, уникальных записей
#1. koji Off (3)
Участник
2015.08.24 19:07
Как можно провести такую выборку? Поиск выдает решение ORDER BY RAND() однако, говорят, что это сказывается на производительности.
#2. Gemorroj Off (107)
Administrator
2015.08.24 22:10
сказывается. но если у тебя БД не 1.000.000 записей, то забей и используй order by rand. т.к. иные решения чересчур черезжопные.
#3. koji Off (3)
Участник
2015.08.24 23:11
Gemorroj, сделал набросок через multi_query и php, но мне бы получать как-то уникальный rand. Может имеется у тебя?
так:
запрос кол-ва записей в бд;
генерация 10 чисел из этого диапазона при помощи PHP rand();
генерация в цикле 10 запросов с этими случайными числами, т.е. их подстановка;
запрос через multi_query
#4. koji Off (3)
Участник
2015.08.25 08:08
Не знаю как производить дополнительную генерацию rand внутри if (in_array($rand, $random)) до тех пор пока не выпадет уникальное число.
Еще можно нарандить 100 чисел и пропустить их через array_unique.
Как быть, Gemorroj, пожалуйста, доведи до ума.
Код:
<?
 
$row[0] = 20; // суммарное кол-во записей в БД
$random = [];
$match = 0;
 
      for ($i = 1; $i <= 10; $i++)
      {
        $rand = (string) rand(1, $row[0]);
 
        if (in_array($rand, $random))
        {
          // если есть совпадение запускаем rand еще раз
          $rand  = (string) rand(1, $row[0]);
          $match += 1; // узнать кол-во совпадений
        }
        $random[$i]   = $rand; // массив уникальных чисел
      }
 
 
 
echo      var_dump($random) . '<br>';
echo      $match . '<br>';
 
?>
#5. koji Off (3)
Участник
2015.08.25 08:08
Какая вероятность что из 50 random чисел не окажется 10 уникальных? Этот вариант тоже подходит, но его нельзя масштабировать. Чем больше диапазон требуемых уникальных чисел тем больше потребуется генерировать случайных и медленнее будет работать.

Код:
$row[0] = 20; // суммарное кол-во записей в БД
 
for ($i = 1; $i <= 50; $i++)
{
$rand[] = rand(1, $row[0]);
}
 
$unique = array_unique($rand); // здесь еще бы ключи переписать последовательно: 0 1 2 3 4 5 6 7...
 
for ($i = 1; $i <= 10; $i++)
{
echo $unique[$i] . ', ';
}
#6. Gemorroj Off (107)
Administrator
2015.08.25 09:09
я так и не понял чем не подошел order by rand
#7. koji Off (3)
Участник
2015.08.25 09:09
Gemorroj, совесть сожрет. Альтернатива в 2 минутах.. через multi_query
#8. tipsun Off (19)
Moderator
2015.08.25 11:11
koji, а нельзя сделать типа: сгенерировать 1 случайное число и ограничить кол-во записей LIMIT 10.
А чтоб не получилось так, что не хватает записи при 100 записях в базе и сгенерило случ. число 95, сделать -10 у получаемого рандомного числа.
Записи будут только идти подряд, но будут уникальными и своего рода тоже рандомными smile
- - - -
Во всех остальных случаях тебе все равно надо обращаться к базе с COUNT(), чтоб узнать текущее кол-во записей, вложить в функцию, возможно свою, чтоб получить 100% рандомных 10 чисел, снова отправить запрос в базу, вытащить запрос.
Добавлено спустя   6 минут  24 секунды:
Вот ещё на хабре пишут про оптимизацию:
- http://habrahabr.ru/post/55864/
- http://habrahabr.ru/post/54176/
- http://habrahabr.ru/post/54176/#comment_1444785
#9. koji Off (3)
Участник
2015.08.25 11:11
tipsun, не совсем понял, что рекомендуешь на словах. Благодарю за хабра-ссылки, надо бы замерить скорость.
#10. tipsun Off (19)
Moderator
2015.08.25 11:11
koji, ну сгенерировал 1 число (выбрал 1 случайное id/запись) и далее после него цепляешь еще, 9 за ним которые.
Если записи не повторяются, то 100% уникальность гарантирована.
Но они будут идти подряд: типа 51 и цепляешь 52, 53, .., 60
Не знаю, это лишь мысль, как будет с производительностью и все такое..
Страниц: 1 2 Все
Главная
WEB
PunBB Mod v0.6.2
0.013 s