Combinaison de l'ordre aléatoire et croissant dans les requêtes MySQL
Dans un scénario de base de données où vous avez un nombre important d'utilisateurs, vous pouvez rencontrer une situation où vous souhaitez sélectionner au hasard un sous-ensemble d'entre eux et les trier davantage par un attribut spécifique, tel que le nom. Bien que cela puisse sembler une tâche simple, les requêtes SQL standard peuvent ne pas toujours fournir le résultat souhaité.
Une approche que vous pourriez envisager consiste à utiliser ORDER BY rand(), qui est souvent utilisée pour récupérer des résultats aléatoires de une base de données. Cependant, lorsqu'elle est combinée avec une autre clause ORDER BY, telle que nom ASC, elle peut ne pas fonctionner comme prévu. Par exemple, la requête ci-dessous peut ne pas produire le résultat souhaité :
<code class="sql">SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20</code>
Cette requête tente de sélectionner au hasard 20 utilisateurs, puis de les classer par ordre croissant selon leur attribut de nom. Cependant, il est important de comprendre que les systèmes de gestion de bases de données (SGBD) traitent les requêtes de gauche à droite. Par conséquent, dans ce cas, la fonction rand() est appliquée en premier, mélangeant ainsi l’intégralité de l’ensemble de données. Par la suite, la clause de nom ASC est appliquée, mais comme les données ont déjà été randomisées, elle n'a aucun effet significatif sur l'ordre des résultats.
Une solution de sous-requête
Pour obtenir le comportement souhaité, vous pouvez utiliser une sous-requête dans la requête principale. Une sous-requête est une requête imbriquée qui peut être utilisée pour isoler un sous-ensemble de données et lui appliquer une logique spécifique. En exploitant une sous-requête, vous pouvez d'abord sélectionner au hasard 20 utilisateurs, puis les classer par leur attribut de nom dans la sous-requête.
Voici un exemple de requête révisée qui utilise une sous-requête :
<code class="sql">SELECT * FROM ( SELECT * FROM users ORDER BY rand() LIMIT 20 ) T1 ORDER BY name</code>
Dans cette requête, la sous-requête (SELECT * FROM users ORDER BY rand() LIMIT 20) sélectionne 20 utilisateurs de la table users dans un ordre aléatoire et les stocke dans une table temporaire T1. La requête externe sélectionne ensuite toutes les colonnes de T1 et classe les résultats par l'attribut name.
En utilisant une sous-requête, vous vous assurez que la fonction rand() est appliquée uniquement au sous-ensemble d'utilisateurs que vous souhaitez utiliser de manière aléatoire. sélectionner. Cette approche garantit que l'ordre ultérieur des noms est appliqué aux données déjà randomisées, produisant le résultat souhaité de 20 utilisateurs sélectionnés au hasard, classés par ordre alphabétique de leurs noms.
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!