2010-12-03 66 views
16

我有一個這樣的數據庫:MYSQL ORDER BY CASE問題

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

我需要把所有4行

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

這是發言。我現在有:

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 

這個效果很好,就是輸出這個:

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

但我需要兩個時間戳列訂購好像他們是一個,因此會爲了這樣的:

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

我希望這是有道理的。基本上,我想有兩個特定於WHERE條件的ORDER BY列。然後,一旦爲該行選擇了正確的ORDER BY列,它就會將整個時間戳的ROWS排序。

+0

您是不是要找 「ORDER BY如果 'id_two'= 27 'timestamp_two'」? – buru 2010-12-03 15:09:23

+1

如果一個時間戳或另一個時間戳總是`NULL`,那麼執行`ORDER BY IFNULL(timestamp_one,timestamp_two)`可能會更清晰。 – dkarp 2015-04-28 17:11:42

回答

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

謝謝你,工作完美! – ATLChris 2010-12-03 15:19:33

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