web-dev-qa-db-fra.com

ORDRE MySQL PAR Rand (), nom ASC

Je voudrais prendre une base de données de 1000 utilisateurs et en sélectionner 20 au hasard (ORDER BY Rand(), LIMIT 20) Puis commander l'ensemble résultant par les noms. Je suis venu avec la requête suivante qui est pas fonctionne comme je l'espérais.

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

38
Josh K

Utilisez une sous-requête:

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

La requête interne sélectionne 20 utilisateurs au hasard et la requête externe classe les utilisateurs sélectionnés par nom.

59
Mark Byers

Au lieu d'utiliser une sous-requête, vous pouvez utiliser deux requêtes distinctes, l'une pour obtenir le nombre de lignes et l'autre pour sélectionner les lignes aléatoires.

SELECT COUNT(id) FROM users; #id is the primary key

Ensuite, obtenez vingt rangées aléatoires.

$start_row = mt_Rand(0, $total_rows - 20);

La dernière requête:

SELECT * FROM users ORDER BY name ASC LIMIT $start_row, 20;
9
Siqi Lin

Méfiez-vous de ORDER BY Rand () en raison des performances et des résultats. Consultez cet article: http://jan.kneschke.de/projects/mysql/order-by-Rand/

9
ircmaxell
SELECT  *
FROM    (
        SELECT  *
        FROM    users
        WHERE   1
        ORDER BY
                Rand()
        LIMIT 20
        ) q
ORDER BY
        name
2
Quassnoi

Utilisez une sous-requête:

SELECT * FROM (
    SELECT * FROM users ORDER BY Rand() LIMIT 20
) u
ORDER BY name

ou une jointure à elle-même:

SELECT * FROM users u1
INNER JOIN (
    SELECT id FROM users ORDER BY Rand() LIMIT 20
) u2 USING(id)
ORDER BY u1.name