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
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.
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;
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/
SELECT *
FROM (
SELECT *
FROM users
WHERE 1
ORDER BY
Rand()
LIMIT 20
) q
ORDER BY
name
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