Maison >base de données >tutoriel mysql >Comment trier les lignes MySQL en fonction de plusieurs colonnes d'horodatage avec un tri conditionnel ?
Problème d'instruction MySQL ORDER BY CASE : commande de plusieurs colonnes d'horodatage
Dans MySQL, la clause ORDER BY est couramment utilisée pour trier les résultats de une requête basée sur une colonne spécifique. Cependant, lorsqu'il s'agit de plusieurs colonnes qui doivent être ordonnées de manière conditionnelle, un défi courant se pose.
Considérez le scénario suivant : vous disposez d'une table de base de données avec une structure en tant que telle :
------------------------------------------------------------------- | id_one | id_two | timestamp_one | timestamp_two | ------------------------------------------------------------------- | 27 | 35 | 9:30 | NULL | ------------------------------------------------------------------- | 35 | 27 | NULL | 9:35 | ------------------------------------------------------------------- | 27 | 35 | 9:34 | NULL | ------------------------------------------------------------------- | 35 | 27 | NULL | 9:33 | -------------------------------------------------------------------
L'objectif est de récupérer les quatre lignes et de les classer par timestamp_one et timestamp_two tout en tenant compte de conditions spécifiques. Plus précisément, si id_one est égal à 27, les lignes doivent être classées par timestamp_one ; sinon, si id_two est égal à 27, ils doivent être classés par timestamp_two.
Pour y parvenir, de nombreuses tentatives d'utilisation de l'instruction CASE dans la clause ORDER BY, telles que :
SELECT * FROM tablename WHERE id_one=27 OR id_two=27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one END DESC, CASE WHEN id_two=27 THEN timestamp_two END DESC
While cette approche donne l'ordre souhaité pour les lignes individuelles, elle ne parvient pas à combiner les deux colonnes d'horodatage dans un ordre unifié, car elles ne sont pas considérées comme une seule entité.
Solution :
Pour ordonner les lignes comme nous le souhaitons, nous pouvons utiliser une version modifiée de l'instruction CASE dans la clause ORDER BY :
SELECT id_one, id_two, timestamp_one, timestamp_two FROM tablename WHERE id_one = 27 OR id_two = 27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one WHEN id_two=27 THEN timestamp_two END DESC
Cette modification traite à la fois timestamp_one et timestamp_two comme une seule entité et ordonne les lignes par conséquent. L'instruction CASE attribue un ordre décroissant aux deux colonnes d'horodatage en fonction des conditions spécifiées dans la clause WHERE, garantissant que les lignes sont classées dans leur ensemble.
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!