Я хотел бы взять базу данных, скажем, 1000 пользователей и выбрать 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;
Остерегайтесь 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
Используйте подзапрос:
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