2011-10-11 36 views
8

我有一個問題,我碰到一段有趣的代碼。在MySQL聲明有一樣的東西:在MYSQL ORDER BY和=(等於)

{...} ORDER BY不管= 3 ASC,無論= 4 ASC,無論= 6 ASC {...}

這是否意味着,它會爲了這樣?:

thing | whatever 
15 | 1 
1  | 3 
5  | 3 
8  | 3 
2  | 4 
3  | 4 
6  | 4 
4  | 6 
7  | 6 
9  | 6 
14 | 9 
21 | 10 
18 | 9 
... 

這似乎是分揀只是無論其等於3,4和6剩下的就是無序...

這是一個正確的/支持的語法?

回答

7

whatever=3的計算結果爲布爾值,0爲false,1true

因爲它是按順序升序不符合條件的將先訂購。然後第二排序欄whatever=4進場,所以whatever=4將在該組中排在最後,等等。

對於其中whatever不在(3,4,6)中的訂單,未指定任何訂單作爲tiebreaker並且排序是任意的。

它在MySQL中支持語法,但不是標準或可移植的。

+0

'因爲它是有序的上升不符合條件的將被責令first'替換此? 請詳細說明爲什麼是第一個?按命令首先你的意思是出現在頂部? –

+1

@GhazanfarMir因爲如果你排序值'0'和'1'升序。首先是「0」(是的,在頂部)。 –

+0

@downvoter - 這個問題有些問題?請解釋! –

1

實際上它由訂單比較的結果,這是0或1的布爾值生成的代碼是一樣的東西(僞代碼):

ORDER BY 
    CASE whatever = 3 THEN 1 ELSE 0 
    ASC, 
    CASE whatever = 4 THEN 1 ELSE 0 
    ASC 

到底哪個來(如果值列表),

ORDER BY 0,0,1 
ORDER BY 0,1,0 

,如果該值是不在列表中:

ORDER BY 0,0,0 

所以價值不在列表中的s被認爲具有相同的值並且沒有排序,並且列表中的值根據列表中的位置排序。

你可以用ORDER BY FIELD(whatever, 3,4,6)documentation