Выборка нескольких случайных записей из таблицы

Статус
В этой теме нельзя размещать новые ответы.
В таблице может не быть записи с таким id :( Что тогда делать?
PHP:
list($id_min, $id_max) = mysql_fetch_row(mysql_query('SELECT MIN(`id`),MAX(`id`) FROM table'));
$id_var1 = rand($id_min, $id_max);
mysql_query("SELECT * FROM table WHERE `id`>={$id_var1} ORDER BY `id` ASC LIMIT 1");

Но такое решение увеличивает вероятность выборки той записи, которая стоит после дырки. И чем больше дырка, тем больше эта вероятность.
 
А может быть и так сойжёт?

SELECT a.prdId
FROM `sc_product` a
JOIN (
SELECT ceil( rand( ) * 99999 ) AS prdID
FROM `sc_product`
LIMIT 777
) AS b ON a.prdId = b.prdID
LIMIT 3

99999 - разрядность колонки id
777 - подбирается опытным путем, зависит от разряженности значений в колонке id
 
В предыдущем посте по-моему имелось ввиду вот что:



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

Но надо сказать, что у меня оракл (выделенный сервер и нет сильных ограничений на ресурсы), а вот в данном случае - под mysql на хостинге, - что в базе, что в клиенте, по-моему, индифферентно - на больших выборках этот скрипт будет есть одни ресурсы. А для маленьких - самое то.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху