2010-12-03 15 views
16

Tengo una base de datos de la siguiente manera:MySQL ORDER BY Edición CASO

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

tengo que tirar de los 4 filas

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

Este es el comunicado que tengo ahora:

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 

Esto funciona bien en que es salidas esto:

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

pero necesito dos columnas de fecha y hora a la orden como si fueran uno por lo que sería pedir así:

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

Espero que esto tenga sentido. Esencialmente, estoy tratando de tener dos columnas ORDER BY que son específicas de una condición WHERE. Luego, una vez que se elige la columna correcta ORDER BY para esa fila, ordena las ROWS por la marca de tiempo como un todo.

+0

¿Se refiere a "ORDER BY 'timestamp_two' si 'id_two' = 27"? – buru

+1

Si una marca de tiempo u otra es siempre 'NULL', podría ser más claro hacer' ORDER BY IFNULL (timestamp_one, timestamp_two) '. – dkarp

Respuesta

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

¡Gracias, funcionó a la perfección! – ATLChris

+0

es este mysql específico? ¿o esto también es posible para otras bases de datos sql como postgre o informix? – emfi

+0

@emfi Esto debería funcionar con cualquier base de datos que admita condiciones - Creo que las dos que mencionaste son compatibles con 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

Debe agregar una explicación a su respuesta. – deW1