Подтвердить что ты не робот

MySQL ORDER BY rand(), имя ASC

Я хотел бы взять базу данных, скажем, 1000 пользователей и выбрать 20 случайных (ORDER BY rand(), LIMIT 20), а затем упорядочить полученный набор именами. Я придумал следующий запрос, который не работает, как я надеялся.

SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20

4b9b3361

Ответ 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;

Ответ 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