Maison  >  Article  >  base de données  >  Comment sélectionner un sous-ensemble aléatoire puis trier par une autre colonne dans MySQL ?

Comment sélectionner un sous-ensemble aléatoire puis trier par une autre colonne dans MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 06:04:31680parcourir

 How to Select a Random Subset and Then Order by Another Column in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn