2010-12-03 9 views
16

J'ai une base de données comme ceci:ORDRE MYSQL PAR CAS Problème

------------------------------------------------------------------- 
| 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  | 
------------------------------------------------------------------- 

Je dois tirer les 4 rangs

ORDER BY 'timestamp_one' if 'id_one'=27 or 
ORDER BY 'timestamp_two' if 'id_one'=27 

Ceci est la déclaration que j'ai maintenant:

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 

Cela fonctionne bien dans ce qui est sorties ce:

------------------------------------------------------------------- 
| id_one | id_two | timestamp_one | timestamp_two | 
------------------------------------------------------------------- 
|  27  |  35  |  9:30  |  NULL  | 
------------------------------------------------------------------- 
|  27  |  35  |  9:34  |  NULL  | 
------------------------------------------------------------------- 
|  35  |  27  |  NULL  |  9:33  | 
------------------------------------------------------------------- 
|  35  |  27  |  NULL  |  9:35  | 
------------------------------------------------------------------- 

Mais je dois deux colonnes d'horodatage à l'ordre comme ils sont l'un, il ordonne ainsi comme ceci:

------------------------------------------------------------------- 
| id_one | id_two | timestamp_one | timestamp_two | 
------------------------------------------------------------------- 
|  27  |  35  |  9:30  |  NULL  | 
------------------------------------------------------------------- 
|  35  |  27  |  NULL  |  9:33  | 
------------------------------------------------------------------- 
|  27  |  35  |  9:34  |  NULL  | 
------------------------------------------------------------------- 
|  35  |  27  |  NULL  |  9:35  | 
------------------------------------------------------------------- 

J'espère que cela a du sens. Essentiellement, j'essaie d'avoir deux colonnes ORDER BY qui sont spécifiques à une condition WHERE. Ensuite, une fois que la colonne ORDER BY correcte est choisie pour cette ligne, elle ordonne les ROWS par l'horodatage dans son ensemble.

+0

Essayez avec cette orthographe "ORDER BY 'timestamp_two' si 'id_two' = 27"? – buru

+1

Si un horodatage ou l'autre est toujours 'NULL', il peut être plus clair de faire' ORDER BY IFNULL (timestamp_one, timestamp_two) '. – dkarp

Répondre

35
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 
+0

Merci, a parfaitement fonctionné! – ATLChris

+0

est ce mysql spécifique? ou est-ce aussi possible pour d'autres bases de données sql comme postgre ou informix? – emfi

+0

@emfi Cela devrait fonctionner avec n'importe quelle base de données qui supporte les conditions - je crois que les deux que vous avez mentionnées supportent CASE. – RedFilter

9
SELECT 
    id_one, 
    id_two, 
    (CASE 
     WHEN id_one=27 THEN timestamp_one 
     WHEN id_two=27 THEN timestamp_two  
    END) as timestamp 
FROM tablename 
ORDER BY timestamp DESC 
1
SELECT * FROM tablename 
WHERE id_one=27 OR id_two=27 
ORDER BY id ASC, timestamp_one DESC 
+1

Vous devriez ajouter une explication à votre réponse. – deW1