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
Libérer: 2024-11-16 02:37:03
original
978 Les gens l'ont consulté

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      |
-------------------------------------------------------------------
Copier après la connexion

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
Copier après la connexion

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 
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal