2012-06-21 24 views
1

我讀過一些有相同問題的文章。我試圖調整自己的答案,但沒有成功。 我想根據狀態對列進行排序,而不是根據狀態對列進行進一步排序。 願下面的查詢將清除我的觀點mysql中的條件排序子句

SELECT a.*,STR_TO_DATE(d_date, "%m/%d/%Y")>CURDATE() as status 
FROM table AS a ORDER BY status DESC, 
IF(status=0, 
'DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) DESC', 
'DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) ASC') 

UPDATE: 以下查詢

SELECT a . * , STR_TO_DATE(d_date, "%m/%d/%Y") > CURDATE() AS 
STATUS 
FROM `table` AS a 
ORDER BY STATUS DESC , IF( 
STATUS =0, DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y") , CURDATE()) DESC , DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y") , CURDATE()) ASC) 
LIMIT 0 , 30 

我有下面的錯誤

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC, DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) ASC) LIMIT ' at line 4 

後如果我的表名是table比對於此記錄

d_date 
06/28/2012 
06/23/2012 
06/20/2012 
06/19/2012 

如果當前日期爲06/21/2012

輸出應該是

d_date    status 
06/23/2012    1 
06/28/2012    1 
06/20/2012    0 
06/19/2012    0 

可能會將此信息就足夠了。如果還不清楚,請告訴我。

感謝

+1

不要在你的'IF'使用引號..否則它將被視爲一個字符串。 – arnep

+0

是'IF'支持mysql或不.Iam可疑 – 2012-06-21 11:34:03

+0

@Somebodyisintrouble:允許。請參閱[這裏](http://dev.mysql.com/doc/refman/5.5/en/if-statement.html) –

回答

3

嘗試這一個 -

SELECT 
    a.*, 
    STR_TO_DATE(d_date, '%m/%d/%Y') > CURDATE() AS status 
FROM 
    table AS a 
ORDER BY 
    status DESC, 
    IF(status = 0, 
    DATEDIFF(STR_TO_DATE(a.d_date, '%m/%d/%Y'),CURDATE()) * -1, 
    DATEDIFF(STR_TO_DATE(a.d_date, '%m/%d/%Y'),CURDATE()) 
) 
+0

謝謝Devart你的答案完成了這項工作。 – Irfan

+1

真棒..我不敢相信它...... –

+0

是的,這是一個小技巧,有助於避免在ORDER BY子句中使用ASC或DESC。 – Devart

0

我想這(新的)解決方案將做的伎倆:

SELECT a.*, STR_TO_DATE(d_date, "%m/%d/%Y")>CURDATE() as status 
FROM `table` AS a ORDER BY status DESC, 
IF(status=0, 
CONCAT_WS(' ', DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()), 'DESC'), 
CONCAT_WS(' ', DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()), 'ASC'))