Maison >base de données >tutoriel mysql >Comment trier les lignes MySQL en fonction de plusieurs colonnes d'horodatage avec un tri conditionnel ?

Comment trier les lignes MySQL en fonction de plusieurs colonnes d'horodatage avec un tri conditionnel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 02:37:03972parcourir

How to Order MySQL Rows Based on Multiple Timestamp Columns with Conditional Sorting?

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!

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