是否可以按照預定順序執行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);都以相同的順序返回它們。
是否可以按照預定順序執行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);都以相同的順序返回它們。
我不認爲這是可能的,但發現一個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
的結果命令。
假設有效,這是一個非常好的解決方案。 – JosephStyons 2008-09-25 16:42:01
所有的排序都是由ORDER BY關鍵字完成的,但是隻能按升序和降序排序。如果你使用的是PHP這樣的語言,那麼你可以使用一些代碼對它們進行相應的排序,但是我不相信只用MySQL就是可能的。
這適用於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
您是否可以包含一個case表達式,將您的ID 7,2,5,...映射到1,2,3 ...,然後按該表達式排序?
您可能需要創建一個帶有自動編號字段的臨時表並按所需順序插入。然後在新的自動編號字段上排序。
這是哈克(可能慢),但你可以與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功能。
盡我所能想到的是加入了第二列orderColumn:
7 1
2 2
5 3
9 4
8 5
然後就是做一個ORDER BY orderColumn
嗯,不是真的。最近你可以得到大概是:
SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3
但你可能不希望:)
很難給你更具體的建議沒有關於什麼是表中的詳細信息。
ORDER BY FIELD(ID,7,2,4,5,8)是你最好的選擇,但它仍然很醜。
您快速獲得答案在這裏,你不...
的原因,我問這是,這是我能想到的,以避免排序複雜的多維數組的唯一途徑。我並不是說這將很難排序,但如果有一種更簡單的方法來使用直接sql,那麼爲什麼不呢。
一個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。適用於一小組值。
這個問題的標題不清楚。請對其進行編輯,以便滾動瀏覽問題的人可以理解它。 – 2008-09-25 16:47:16