工作中新測出來的bug,經查找,發現場景是這樣子的:
一個課程在添加多個課件的時候,課件排列的順序對應的課件id是3099,2727,2485,2488,2487,3029,
因此代碼里我使用了IN查詢,SQL語句如下:
select * from file_info where id in(3099,2727,2485,2488,2487,3029);
結果如下圖:
問題來了,in查詢默認是按id升序排列的,但我添加的課件並不是按照id大小順序排列的,我需要拿到的是按照給出的ids順序查出的結果。
解決方案一:
select * from file_info where id in(3099,2727,2485,2488,2487,3029) order by field(id, 3099,2727,2485,2488,2487,3029);
這是說,先in查詢,把查出的記錄的id在FIELD列表里面進行查找,以位置作為排序依據返回結果。
解決方案二:
select * from file_info where id in(3099,2727,2485,2488,2487,3029) order by INSTR(',3099,2727,2485,2488,2487,3029,', CONCAT(',',id,','));
instr函數為字符查找函數,查找一個字符串在另一個字符串中首次出現的位置,其中逗號的作用是精確匹配,沒有逗號,匹配就會出現問題。
執行兩個兩個SQL,結果相同,如下圖:

后記:
老實講,instr的知識點我有點暈,再加上一個不慎就會寫錯,遠不如field來的簡便;
另外兩個語句的執行時間分別是:0.007s和0.006秒,消耗性能相差不多,所以我采取了第一種寫法改正了bug。