Maison >base de données >tutoriel mysql >Comment sélectionner un sous-ensemble aléatoire puis trier par une autre colonne dans MySQL ?
Sélection et classement aléatoires dans MySQL
Lors de l'interrogation d'une base de données MySQL, il est courant de vouloir sélectionner un sous-ensemble d'enregistrements de manière aléatoire. La clause ORDER BY RAND() peut être utilisée pour y parvenir. Cependant, il est important de prendre en compte l'ordre des opérations lors de la combinaison de cette clause avec d'autres clauses de classement.
Un piège courant se produit lorsque l'on tente de sélectionner un sous-ensemble aléatoire d'enregistrements, puis de trier l'ensemble résultant selon une autre colonne. La requête suivante en est un exemple :
SELECT * FROM users WHERE 1 ORDER BY RAND(), name ASC LIMIT 20
L'intention de cette requête est de sélectionner 20 utilisateurs aléatoires dans la table des utilisateurs, puis de les classer par ordre croissant selon leur colonne de nom. Cependant, cette requête ne produira pas le résultat souhaité.
La raison en est que la clause ORDER BY RAND() introduit un ordre non déterministe. Cela signifie que l'ordre des résultats changera à chaque fois que la requête est exécutée. Par conséquent, la clause ASC du nom suivant ne peut pas être utilisée pour classer les résultats de manière fiable.
Pour classer correctement les résultats, nous devons utiliser une sous-requête. La requête suivante sélectionnera 20 utilisateurs aléatoires, puis les triera par leur colonne de nom :
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 stocke le résultat dans la table temporaire T1. La requête externe sélectionne ensuite toutes les lignes de T1 et les classe par nom.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!