首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL IN 條件自訂排序:ORDER BY FIND_IN_SET 實戰

     編輯:MySQL 綜合教學

問題:WHERE id IN (2,1,3) 查出順序為 1,2,3 (自然序),但需保持 IN 列表順序 2,1,3。

解法:FIND_IN_SET


SELECT * FROM t WHERE id IN (2,1,3)
ORDER BY FIND_IN_SET(id, '2,1,3');

FIND_IN_SET(str, strlist) 回傳 str 在逗號分隔字串 strlist 中的位置 (1-based),找不到回傳 0。

效能考量

  • FIND_IN_SET 無法使用索引,資料量大時會全表掃描
  • 小結果集 (如 < 1000 行) 可接受
  • 大結果集建議:應用層排序、或用 CASE WHEN 產生排序欄位

替代方案:CASE WHEN (可走索引)


SELECT * FROM t WHERE id IN (2,1,3)
ORDER BY CASE id WHEN 2 THEN 1 WHEN 1 THEN 2 WHEN 3 THEN 3 ELSE 4 END;

優化器可能將 CASE 轉為常數排序,配合 WHERE id IN (...) 索引範圍掃描。

延伸應用:動態排序


-- 前端傳入排序順序 '3,1,2'
SET @order = '3,1,2';
PREPARE stmt FROM 'SELECT * FROM t WHERE id IN (?) ORDER BY FIND_IN_SET(id, ?)';
EXECUTE stmt USING @ids, @order;

記住:IN 列表順序 ≠ 結果順序,需顯式 ORDER BY 指定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved