Maison >base de données >tutoriel mysql >Comment puis-je trier les résultats dans des sections distinctes d'une requête MySQL UNION ?
Introduction :
Lorsque vous utilisez plusieurs instructions SELECT combinées avec UNION pour interroger des données, vous devez trier les résultats de manière appropriée par titre tout en conservant l'indépendance de chaque requête.
Question :
Un scénario est que trois requêtes SELECT récupèrent des données en fonction de différents critères de distance pour la recherche sur un site Web. La première requête récupère les données pour les recherches de localisation exacte, la deuxième requête récupère les données dans un rayon de 5 kilomètres et la troisième requête récupère les données dans un rayon de 5 à 15 kilomètres. Les résultats de la requête sont combinés à l'aide de UNION et affichés sur une page avec un titre. Cependant, l'utilisateur souhaite trier les résultats sous chaque en-tête en fonction de l'identifiant ou de la date add_date.
Solution :
Pour y parvenir, MySQL introduit une pseudo colonne nommée "rank" pour chaque instruction SELECT. Cette pseudo colonne peut être utilisée pour trier dans un premier temps les résultats avant d'appliquer d'autres critères de tri. La requête modifiée suivante illustre cette approche :
<code class="language-sql">SELECT * FROM ( SELECT 1 AS Rank, id, add_date FROM Table UNION ALL SELECT 2 AS Rank, id, add_date FROM Table WHERE distance < 5 UNION ALL SELECT 3 AS Rank, id, add_date FROM Table WHERE distance BETWEEN 5 AND 15 ) AS RankedResults ORDER BY Rank ASC, id DESC, add_date DESC;</code>
Explication :
Pseudo-colonne "Rank": Dans chaque instruction SELECT, une pseudo-colonne nommée "Rank" est introduite et se voit attribuer des valeurs uniques (1, 2 et 3). Cette colonne représente l'ordre ou le regroupement des résultats.
Tri initial par "Classement" : Les résultats UNION sont initialement triés par la colonne "Classement" par ordre croissant. Cela garantit que les résultats sont regroupés selon leurs titres respectifs (« Résultats exacts », « Résultats dans un rayon de 5 km » et « Résultats dans un rayon de 5 à 15 km »).
Tri supplémentaire par « id » et « add_date » : Au sein de chaque groupe (déterminé par « Rank »), les résultats sont ensuite triés par « id » et « add_date » par ordre décroissant.
Remarque :
Cette méthode utilise l'opération UNION ALL, qui contient des lignes en double dans le résultat combiné. Si vous n'avez pas besoin de lignes en double, vous pouvez utiliser l'opération UNION, qui éliminera les doublons.
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!