2008-09-25 55 views
14

是否可以按照預定順序執行SELECT語句,選擇ID 7,2,5,9和8 並按照該順序將它們返回,基於不超過ID字段?以預定義順序返回查詢結果

Statements SELECT id FROM table WHERE id in(7,2,5,9,8);和SELECT id FROM table WHERE id in(8,2,5,9,7);都以相同的順序返回它們。

+0

這個問題的標題不清楚。請對其進行編輯,以便滾動瀏覽問題的人可以理解它。 – 2008-09-25 16:47:16

回答

34

我不認爲這是可能的,但發現一個blog entry here似乎做你的事情後類型:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8"); 

將向

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7"); 

FIND_IN_SET給出不同的結果在給出的第二個參數中返回id的位置,因此對於上面的第一個情況,7的id位於集合中的位置1,2在2等等 - mysql在內部執行類似

id | FIND_IN_SET 
---|----------- 
7 | 1 
2 | 2 
5 | 3 

然後按FIND_IN_SET的結果命令。

+0

假設有效,這是一個非常好的解決方案。 – JosephStyons 2008-09-25 16:42:01

0

所有的排序都是由ORDER BY關鍵字完成的,但是隻能按升序和降序排序。如果你使用的是PHP這樣的語言,那麼你可以使用一些代碼對它們進行相應的排序,但是我不相信只用MySQL就是可能的。

0

這適用於Oracle。你可以在MySql中做類似的事嗎?

SELECT ID_FIELD 
FROM SOME_TABLE 
WHERE ID_FIELD IN(11,10,14,12,13) 
ORDER BY 
    CASE WHEN ID_FIELD = 11 THEN 0 
     WHEN ID_FIELD = 10 THEN 1 
     WHEN ID_FIELD = 14 THEN 2 
     WHEN ID_FIELD = 12 THEN 3 
     WHEN ID_FIELD = 13 THEN 4 
    END 
1

您是否可以包含一個case表達式,將您的ID 7,2,5,...映射到1,2,3 ...,然後按該表達式排序?

0

您可能需要創建一個帶有自動編號字段的臨時表並按所需順序插入。然後在新的自動編號字段上排序。

0

這是哈克(可能慢),但你可以與UNION得到的效果ALL:

SELECT id FROM table WHERE id = 7 
UNION ALL SELECT id FROM table WHERE id = 2 
UNION ALL SELECT id FROM table WHERE id = 5 
UNION ALL SELECT id FROM table WHERE id = 9 
UNION ALL SELECT id FROM table WHERE id = 8; 

編輯:其他人提及的是記錄here的FIND_IN_SET功能。

-1

盡我所能想到的是加入了第二列orderColumn:

7 1 
2 2 
5 3 
9 4 
8 5 

然後就是做一個ORDER BY orderColumn

0

嗯,不是真的。最近你可以得到大概是:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3 

但你可能不希望:)

很難給你更具體的建議沒有關於什麼是表中的詳細信息。

2

ORDER BY FIELD(ID,7,2,4,5,8)是你最好的選擇,但它仍然很醜。

0

您快速獲得答案在這裏,你不...

的原因,我問這是,這是我能想到的,以避免排序複雜的多維數組的唯一途徑。我並不是說這將很難排序,但如果有一種更簡單的方法來使用直接sql,那麼爲什麼不呢。

0

一個Oracle解決方案是:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6); 

此順序號分配給每個ID。適用於一小組值。