2017-06-07 126 views
0

我有一個帖子(新聞)表,但他們可以有不同的日期屬性,其中一些可能未設置(0)。我想在所有字段上訂購DESC,然後在尊重時間順序的情況下得到結果,而不是我在查詢中給出的順序。如何按多個時間戳字段排序並按時間順序返回?

title | pubdate  | startdate | enddate  | closedate | 
------------------------------------------------------------ 
exm1 | 1271887200 |   0 |   0 |   0 | 
exm2 | 1291071600 |   0 |   0 |   0 | 
exm3 |   0 | 1496102400 | 1496361600 |   0 | 
exm4 | 1496620800 |   0 |   0 |   0 | 
exm5 |   0 | 1501545600 | 1501891200 | 1496966400 | 
exm6 |   0 | 1493856000 | 1496361600 |   0 | 

相關字段爲「pubdate」,「startdate」或「closedate」。所以我所做的就是簡單地把他們變成我的ORDER BY語句:

SELECT * FROM news ORDER BY closedate DESC, startdate DESC, pubdate DESC 

當然這樣的作品,但我注意到,這始終把行與「closedate」到結果的前面,其次是「開始日期」結果等等。而排序只發生在切片內,而不是所有的值。他們被對待像一個不同的集合,縫合在一起。

因此,結果是:exm5,exm3,exm6,exm4,EXM2,EXM1

,但我想以下幾點:exm5,exm4,exm3,exm6,EXM2,EXM1

原因:

- exm5 close is 06.09.2017 (and pub is 0) 
- exm4 pub is 06.05.2017 (and close is 0 and enddate is 0) 
- exm3 start is 05.30.2017 (and close is 0 and pub is 0) 
- exm6 start is 05.04.2017 (and close is 0 and pub is 0) 

我可以通過代碼應用此排序,但我想使用此查詢的LIMIT和偏移量,維護分頁順序。

我覺得我不知何故必須合併這些值和排序在一個單一的領域,但我不知道如何做到這一點,或者如果它甚至可能只與MYSQL。

任何想法?謝謝。

回答

1

也許greatest()你想要做什麼:

ORDER BY GREATEST(closedate, startdate, pubdate) DESC 

你似乎使用0缺失值。如果是這樣,這很好。如果你實際上有NULL,那麼邏輯需要處理它們。

編輯:

如果你有一個優先級,然後使用:

ORDER BY (CASE WHEN closeddate > 0 THEN closeddate 
       WHEN startdate > 0 THEN startdate 
       ELSE pubdate 
      END) 

這適用於NULL值。

+0

聽起來很有希望!是的,我確實有DEFAULT'0'幸運地 – m3nt0r

+0

我試過了,但問題是如果設置了closedate,它會優先於startdate(將來的日期)。最好會返回startdate並忽略closedate,因爲它始終更低。編輯:看到「exm5」 – m3nt0r

+0

那裏的精彩解決方案。使用CASE編輯的版本解決了我所有的問題。謝謝! – m3nt0r