在進行MySQL查詢時,遇到一個問題:查詢出來的字段的順序需要按照IN裏面值的順序進行排序。
SELECT
*
FROM
test
WHERE
xxxx_id IN ( 651877011734764416, 737560066717227904, 738885949361068928 )
注意圖中IN後面的順序和查詢出來的結果的順序。如果WHERE後面沒有ORDER BY字段,無論IN裏面的順序是怎麼樣的,最後的結果都是按照id的進行順排。
若想按照INl裏面的字段排序,此時我們需要用到field(),它是MySQL自定義排序規則函數,一般與IN關鍵字和ORDER BY連用,用於將查詢結果按照field()函數裏面的的順序返回。
##其中field是關鍵字
SELECT
*
FROM
test
WHERE
xxxx_id IN ( 651877011734764416, 737560066717227904, 738885949361068928 )
ORDER BY
field( xxxx_id, 651877011734764416, 737560066717227904, 738885949361068928 )
使用MyBatis,只需在ORDER BY後添加該排序函數即可:
xxx_id爲需要進行排序的字段,後面的item爲其值
....................
....................
ORDER BY field(xxx_id,
<foreach collection="xxxList" item="item" index="index" separator=",">
#{item,jdbcType=BIGINT}
</foreach>
當然,該函數若非情非得已,是不推薦使用的。在這裏我做了一個測試,將field()函數裏面的排序字段(字段類型爲BIGINT)作爲唯一索引,在500萬數據下,IN中個數爲4000個時,耗時是不進行ORDER BY 時的兩倍多。
排序前:
排序後:
綜合前面三張圖,500萬數據下,用IN查詢出4000條數據只要0.204s,排序後則需要0.473s .由此可見,當排序字段不爲BIGINT型,且不是唯一索引時,這速度究竟會有多慢。