業務須要,經過lucene查出符合搜索條件的id,而後在詳情表裏查出這些id的詳情 html
SELECT id,QUESTION,QUESTIONCOMMENT FROM "ASKDBA_QUESTION" where ID IN (63,62,65,61,64);其中id是根據搜索的權值進行的排序,sql沒有問題,可是經過這種sql查出來的結果的排序就不對了。
61 測試問題101 測試問題101 62 測試問題102 測試問題102 63 測試問題103 測試問題103 64 測試問題104 測試問題104 65 測試問題106 測試問題106
這個通常默認是按照主鍵來排序的,而並非根據in中條件的順序來排列的 mysql
網上有個案例是按照in順序來排序的解決方案,是利用sql server的charindex來解決的。不過僅限於sqlserver sql
select id,title from info where id in ('3,1,2,5,4') order by charindex(','+convert(varchar,ID)+',',',3,1,2,5,4,')
http://www.sosuo8.com/article/show.asp?id=2958
shell
CHARINDEX函數返回字符或者字符串在另外一個字符串中的起始位置。CHARINDEX函數調用方法以下: CHARINDEX ( expression1 , expression2 [ , start_location ] ) Expression1是要到expression2中尋找的字符中,start_location是CHARINDEX函數開始在expression2中找expression1的位置。 CHARINDEX函數返回一個整數,返回的整數是要找的字符串在被找的字符串中的位置。假如CHARINDEX沒有找到要找的字符串,那麼函數整數「0」這裏有小技巧,能夠利用charindex來進行模糊匹配
select name,pass from dps_user where charindex('張三',dps_user.name)> 0
可是oracle下是怎麼實現相同的效果的呢?能夠使用decode函數 express
SELECT id,QUESTION,QUESTIONCOMMENT FROM "ASKDBA_QUESTION" where ID IN (63,62,65,61,64) ORDER BY "DECODE"(id, 63,1,62,2,65,3,61,64);
63 測試問題103 測試問題103 62 測試問題102 測試問題102 65 測試問題106 測試問題106 61 測試問題101 測試問題101 64 測試問題104 測試問題104結果是符合條件的
decode函數是oracle很強大的一個函數, 緩存
能夠參考一下這個文檔 oracle
http://www.cnblogs.com/ZHF/archive/2008/09/12/1289619.html 函數
http://database.ctocio.com.cn/tips/489/6064989.shtml sqlserver
mysql裏是怎麼實現這種需求的呢? 測試
其實很簡單orderby filed(col,1,2,3,4...)就行
SELECT * from city where id in (4,2,3,1) ORDER BY field(id,4,2,3,1)
4 Mazar-e-Sharif AFG Balkh 127800 2 Qandahar AFG Qandahar 237500 3 Herat AFG Herat 186800 1 Kabul AFG Kabol 1780000
其中filed這個函數的用法以下:
FIELD(str,str1,str2,str3,…) Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found. 排序過程:把選出的記錄的 id 在 FIELD 列表中進行查找,並返回位置,以位置做爲排序依據。 這樣的用法,會致使 Using filesort,是效率很低的排序方式。除非數據變化頻率很低,或者有長時間的緩存,不然不建議用這樣的方式排序。另外也能夠使用substring_index函數或者find_inset函數
http://kidcraze.org/mysql-in-%E6%8E%92%E5%BA%8F%E9%97%AE%E9%A2%98/
總結一下,sql查詢通常會按照orderby字段來進行排序,若是沒有order by 字段,默認是按照數據存儲的順序來顯示的。
因此若是保證按照in順序的字段來排序輸出的話,能夠參考以上幾種方法,即sqlserver藉助charindex,oracle藉助decode,mysql藉助orderby field。