2016-04-25 46 views
0

我想從一個特定的MySQL表中選擇數據。 爲簡單起見,我們假設有3列:在MYSQL中自定義排序

ID Priority ValidDate 
1  5   2016-12-12 
2  5   2016-03-11 
3  0   null 
4  0   null 
5  0   2016-08-01 
6  6   2016-12-31 

我想是到輸出如下排序:

  • 如果ValidDate> CURDATE(),顯示它的一階由ValidDate降序(優先無論)

  • 如果ValidDate爲空或ValidDate < CURDATE(),以便通過優先ASC

因此,對於上面的表格,輸出應該是這樣的:

ID Priority ValidDate 
6  6   2016-12-31 
1  5   2016-12-12 
5  0   2016-08-01 
3  0   null 
4  0   null 
2  5   2016-12-31 

我嘗試此查詢:

SELECT id, image, campaignid, priority, sponsored FROM au_hpbanner order by (sponsored > curdate()) desc, (case when sponsored < curdate() then priority end) asc; 

但因爲行ID 2 ID 5雖然之後仍然來了它不工作它應該在底部。 感謝您的幫助!

回答

0

事實證明這兩種方法的工作(我和聯盟選擇方法建議通過C4ud3x)。但是,兩者都不能正確計算空值,這就是爲什麼我的查詢不起作用的原因。

我的解決方案的正確版本:

SELECT id, image, campaignid, priority, sponsored 
FROM au_hpbanner 
ORDER BY (sponsored > curdate() and sponsored is not null) desc, 
     (case when sponsored < curdate() or sponsored is null then priority end) asc; 

C4ud3x解決方案的略微改進版:

SELECT * 
FROM 
    (SELECT id, image, campaignid, priority, sponsored 
    FROM au_hpbanner 
    WHERE sponsored > curdate() 
    ORDER BY sponsored desc) a 
UNION 
SELECT * 
FROM 
    (SELECT id, image, campaignid, priority, sponsored 
    FROM au_hpbanner 
    WHERE sponsored < curdate() or sponsored is null 
    ORDER BY priority asc) b 

我不知道它的這些方面的性能更好地工作,更好地工作。但是,如果Union Selects需要更多的往返數據庫,那麼第一種解決方案會更好,這對我來說很重要,因爲我正在處理一個龐大的數據庫。

0

一種可能性是做UNION SELECTs這將使更好地控制您的每一個案件:

SELECT * 
FROM 
    (SELECT id, 
     image, 
     campaignid, 
     priority, 
     sponsored 
    FROM au_hpbanner 
    WHERE ValidDate > curdate() 
    ORDER BY ValidDate DESC) a 
UNION 
SELECT * 
FROM 
    (SELECT id, 
     image, 
     campaignid, 
     priority, 
     sponsored 
    FROM au_hpbanner 
    WHERE ValidDate < curdate() 
    ORDER BY priority ASC) b