Я хотел бы взять базу данных, говорят, 1 000 пользователей и выбирают 20 случайных (ORDER BY rand()
,LIMIT 20
) затем закажите получающийся набор именами. Я придумал следующий запрос, который не работает как, я надеялся.
SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20
Используйте подзапрос:
SELECT * FROM
(
SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name
Внутренний запрос выбирает 20 пользователей случайным образом, а внешний запрос упорядочивает выбранных пользователей по имени.
Вместо использования подзапроса вы можете использовать два отдельных запроса: один для получения количества строк, а другой для выбора случайных строк.
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;
Используйте подзапрос:
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
Остерегайтесь ORDER BY RAND () из-за производительности и результатов. Ознакомьтесь с этой статьей: http://jan.kneschke.de/projects/mysql/order-by-rand/
SELECT *
FROM (
SELECT *
FROM users
WHERE 1
ORDER BY
rand()
LIMIT 20
) q
ORDER BY
name