FIND_IN_SET(str, strlist) 返回 str 在逗號分隔字符串 strlist 中的位置(1-based),未找到返回 0。兩大典型用法:
表 t 字段 colid 存儲 ',31,32,21,12' 格式數據。
SELECT * FROM t WHERE FIND_IN_SET('32', colid) > 0;
等效於 colid LIKE '%,32,%' OR colid LIKE '32,%' OR colid LIKE '%,32' OR colid = '32',但語義更清晰、不易出錯。
需按 area 字段順序 2,1,3 輸出。
SELECT * FROM t
WHERE area IN (2,1,3)
ORDER BY FIND_IN_SET(area, '2,1,3');
FIND_IN_SET 返回位置,ORDER BY 按位置升序即得到指定順序。
strlist 必須為常量字符串或字段,不能為表達式(如 CONCAT 結果需先存入變量)。FIND_IN_SET 無法使用索引,屬全表掃描,僅適用中小表或低頻查詢。FIND_IN_SET 是處理「逗號分隔存儲」這一反範式設計的利器,雖不走索引,但在標籤、分類等低基數、低頻查詢場景極其實用。