Рэнд MySQL ORDER BY (), назовите ASC

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

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

40
задан Josh K 21 May 2010 в 13:55
поделиться

5 ответов

Используйте подзапрос:

SELECT * FROM 
(
    SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name 

Внутренний запрос выбирает 20 пользователей случайным образом, а внешний запрос упорядочивает выбранных пользователей по имени.

60
ответ дан 27 November 2019 в 01:30
поделиться

Вместо использования подзапроса вы можете использовать два отдельных запроса: один для получения количества строк, а другой для выбора случайных строк.

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;
9
ответ дан 27 November 2019 в 01:30
поделиться

Используйте подзапрос:

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
2
ответ дан 27 November 2019 в 01:30
поделиться

Остерегайтесь ORDER BY RAND () из-за производительности и результатов. Ознакомьтесь с этой статьей: http://jan.kneschke.de/projects/mysql/order-by-rand/

9
ответ дан 27 November 2019 в 01:30
поделиться
SELECT  *
FROM    (
        SELECT  *
        FROM    users
        WHERE   1
        ORDER BY
                rand()
        LIMIT 20
        ) q
ORDER BY
        name
2
ответ дан 27 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: