title
Description
Body
Gemorroj, сделал набросок через multi_query и php, но мне бы получать как-то уникальный rand. Может имеется у тебя?
так:
запрос кол-ва записей в бд;
генерация 10 чисел из этого диапазона при помощи PHP rand();
генерация в цикле 10 запросов с этими случайными числами, т.е. их подстановка;
запрос через multi_query
Неактивен
Не знаю как производить дополнительную генерацию rand внутри if (in_array($rand, $random)) до тех пор пока не выпадет уникальное число.
Еще можно нарандить 100 чисел и пропустить их через array_unique.
Как быть, Gemorroj, пожалуйста, доведи до ума.
|
|
Неактивен
Какая вероятность что из 50 random чисел не окажется 10 уникальных? Этот вариант тоже подходит, но его нельзя масштабировать. Чем больше диапазон требуемых уникальных чисел тем больше потребуется генерировать случайных и медленнее будет работать.
|
|
Неактивен
koji, а нельзя сделать типа: сгенерировать 1 случайное число и ограничить кол-во записей LIMIT 10.
А чтоб не получилось так, что не хватает записи при 100 записях в базе и сгенерило случ. число 95, сделать -10 у получаемого рандомного числа.
Записи будут только идти подряд, но будут уникальными и своего рода тоже рандомными
- - - -
Во всех остальных случаях тебе все равно надо обращаться к базе с COUNT(), чтоб узнать текущее кол-во записей, вложить в функцию, возможно свою, чтоб получить 100% рандомных 10 чисел, снова отправить запрос в базу, вытащить запрос.
Добавлено спустя 6 минут 24 секунды:
Вот ещё на хабре пишут про оптимизацию:
- http://habrahabr.ru/post/55864/
- http://habrahabr.ru/post/54176/
- http://habrahabr.ru/post/54176/#comment_1444785
Неактивен
koji, ну сгенерировал 1 число (выбрал 1 случайное id/запись) и далее после него цепляешь еще, 9 за ним которые.
Если записи не повторяются, то 100% уникальность гарантирована.
Но они будут идти подряд: типа 51 и цепляешь 52, 53, .., 60
Не знаю, это лишь мысль, как будет с производительностью и все такое..
Неактивен
tipsun, а если окажется что в БД выбранное 51 это последняя запись? Хотя это неплохой вариант. Мне кажется в ссылках есть пример (из комментариев) вроде подходит, надо бы попробовать его. Но хочу доделать свой через мульти + php чтобы сравнить скорость.
Неактивен
tipsun написал:
koji, а нельзя сделать типа: сгенерировать 1 случайное число и ограничить кол-во записей LIMIT 10.
А чтоб не получилось так, что не хватает записи при 100 записях в базе и сгенерило случ. число 95, сделать -10 у получаемого рандомного числа.
Записи будут только идти подряд, но будут уникальными и своего рода тоже рандомными
Неактивен
tipsun, благодарю
Добавлено спустя 5 минут 31 секунду:
При 10646 записях в БД
ORDER BY RAND()
0.014
первый уникальный с последующими за ним числами (51, 52, 53, 54 и т.д.)
0.003
т.е.
|
|
Неактивен
tipsun, видимо на скорую руку набросал я тоже сомневался
доработал свой кусок, он отлично выбрасывает более 10 уникальных random,
выбираю по ключам в масиве $unique от 0 до 9 а остальное остается (2-5 элементов)
|
|
вариант из двух: тот, что посоветовал ты и через multi_query. Последний срабатывает за 0.005. Там сгенерировать 10 запросов с выборкой WHERE id = $unique[$i] Надо бы запустить на базе побольше, тогда точно станет ясно.
Отредактировано koji (2015.08.25 23:03)
Неактивен
Gemorroj, что "скажешь"? Мне кажется есть ещё более крутой и оптимизированный способ.
Чисто из "спортивного" интереса сейчас ещё посидел, подумал.
Вот вроде норм вышло, но чем меньше множество, тем больше повторов и больше циклов.
+ фильтры на данные нужны, чтоб записей было более 0 и все такое крч.
|
|
Неактивен
Если кол-во записей совпадает с кол-во выводимых постов, то можно вообще сделать через: shuffle(range(1, 10));
Кстати подряд идущие записи ты прежде чем вывести можешь раскидать в массиве этой функцией: shuffle($array);
Неактивен