MySQL ORDER BY rand (), имя ASC

Я хотел бы взять базу данных, скажем, 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