Задача: выбрать 5 случайных активных пользователей из таблицы user
Решение:
SELECT userid, user_name FROM user WHERE activity=1 ORDER BY RAND() LIMIT 5
ORDER BY RAND() - удобная конструкция для выборки случайных записей из таблицы. Она не очень быстрая, но удобная в случае выборки более одной случайной записи, и для небольших таблиц то, что доктор прописал. Для таблицы 20 000 записей вышеприведенный запрос занимает 0.02 с.
Вот такой интересный способ выбора случайной записи встречается иногда :-)
$res = mysql_query(‘SELECT userid, user_name FROM user WHERE activity=1’); $j = rand(1,mysql_num_rows($res)); $i=1; while($row=mysql_fetch_array($res)){ if($i==$j){ break; } $i++; }
19.07.2008
Долго смеялся над последним вариантом :)
Да, крутая штука. Мне надо выбрать 10 случайных записей и отсортировать их по другому полю. Код ORDER BY RAND(), `rating` DESC не срабатывает.
SELECT * FROM %tablename$% WHERE %PK_KEY% IN (SELECT %PK_KEY% FROM %tablename% ORDER BY RAND() LIMIT 10) ORDER BY %fieldname% DESC
Да да. order by rand() оооочень каварная штучка. На больших таблицах и выборке нескольких случайных записей подвисает не на шутку.
Способов реализации придумано много, и все они направлены на определение "случайных" не в SQL, а программных скриптах.
А приведённый пример - лишь одна из попыток какого-то студента снять с SQL эту задачу