MySQL ORDER BY rand(), имя ASC
Я хотел бы взять базу данных, скажем, 1000 пользователей и выбрать 20 случайных (ORDER BY rand()
, LIMIT 20
), а затем упорядочить полученный набор именами. Я придумал следующий запрос, который не работает, как я надеялся.
SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20
Ответы
Ответ 1
Использовать подзапрос:
SELECT * FROM
(
SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name
Внутренний запрос выбирает 20 пользователей в случайном порядке, а внешний запрос заказывает выбранных пользователей по имени.
Ответ 2
Вместо использования подзапроса вы можете использовать два отдельных запроса: один, чтобы получить количество строк, а другое - выбирать случайные строки.
SELECT COUNT(id) FROM users; #id is the primary key
Затем получим случайные двадцать строк.
$start_row = mt_rand(0, $total_rows - 20);
Окончательный запрос:
SELECT * FROM users ORDER BY name ASC LIMIT $start_row, 20;
Ответ 3
Остерегайтесь ORDER BY RAND() из-за производительности и результатов. Проверьте эту статью: http://jan.kneschke.de/projects/mysql/order-by-rand/
Ответ 4
SELECT *
FROM (
SELECT *
FROM users
WHERE 1
ORDER BY
rand()
LIMIT 20
) q
ORDER BY
name
Ответ 5
Использовать подзапрос:
SELECT * FROM (
SELECT * FROM users ORDER BY RAND() LIMIT 20
) u
ORDER BY name
или присоединиться к себе:
SELECT * FROM users u1
INNER JOIN (
SELECT id FROM users ORDER BY RAND() LIMIT 20
) u2 USING(id)
ORDER BY u1.name