2011-11-16 66 views
0

我有一個查詢按FIND_IN_SET訂購,然後是第二個ORDER字段... date_added。MySQL使用FIND_IN_SET訂購多個方向

什麼,我想現在做的是一樣的東西:

ORDER BY FIND_IN_SET(status, '1,2,3'), date_added ASC 
AND 
ORDER BY FIND_IN_SET(status, '4,5'), end_date DESC 

所以我要訂購狀態1,2和3的DATE_ADDED ASC和狀態4和5在END_DATE DESC,但我想所有在狀態4和5之前輸出狀態1,2和3的結果。

這可以使用單個查詢完成嗎?

回答

0

這不是ORDER BY的工作原理。您在同一個條款中提供所有條件,並用逗號分隔它們。

閱讀Sorting Rows章節進行快速監督。

更新:

您提供既表定義,也沒有數據樣本,所以這是相當困難的找出你的想法,但我會嘗試猜測。該FIND_IN_SET()函數返回第二個參數中第一個參數的索引位置:

SELECT 
    FIND_IN_SET(2, '1,2,3') AS found, 
    FIND_IN_SET(4, '1,2,3') AS not_found, 
    FIND_IN_SET(NULL, '1,2,3') AS null_needle 

...的回報:

found | not_found | null_needle 
    2 |   0 |  NULL 

我知道你想使用這些信息部分,以組成一個ORDER BY組件(是否在乾草堆中找到針,丟棄其位置)。然後,檢查返回值大於零,應該足夠:

ORDER BY 
    CASE 
     WHEN FIND_IN_SET(status, '1,2,3')>0 THEN date_added 
     WHEN FIND_IN_SET(status, '4,5')>0 THEN end_date DESC 
    END 
+0

是的,我知道那不是如何ORDER BY的作品,但它的我已經使用了第一個查詢使用FIND_IN_SET並正在檢查是否有方法顯示由date_added(因爲它們是活動的應用程序)和4,5秒(因爲它們是已結束的應用程序)首先排序的1,2,3。如果沒有辦法,我只會寫2個查詢。乾杯 – puks1978

0

嘗試這一個 -

SELECT * FROM table_name 
    ORDER BY 
    IF(FIELD(status, 1,2,3), date_added, '9999-12-31') ASC, 
    IF(FIELD(status, 4,5), end_date, NULL) DESC;