FIND_IN_SET 是 MySQL 提供的實用字串函數,專門用於判斷某字串是否存在於「以逗號分隔的字串列表」中。它在處理標籤系統、權限控制、多值欄位查詢等場景時非常高效。
FIND_IN_SET(str, strlist)
'a,b,c')假設有一張記錄使用者群組關係的表,openid 欄位儲存逗號分隔的使用者 ID 列表。我們要找出特定使用者(user_uuid)所屬的所有群組並統計人數:
SELECT t.group_id, COUNT(group_id) AS tsum
FROM (
SELECT group_id
FROM xx
WHERE FIND_IN_SET(openid, 'qqqwqnfocFq5IL2sXB2Qu0I,oarwerrr-2KRah_TklJEomljhlKg,oaSiouEgtr5t5utLFU8-evmkn5BwQ3_c')
AND user_uuid = 'xxxxxxxxxxxx'
) t
GROUP BY group_id;
FIND_IN_SET('a', 'a,b,ab') 回傳 1,不會誤匹配 'ab'| 函數/運算子 | 適用場景 | 索引支援 | 精確度 |
|---|---|---|---|
| FIND_IN_SET | 逗號分隔字串精確查找 | 無 | 高(精確匹配) |
| LIKE '%val%' | 模糊查詢 | 無(前導 %) | 低(易誤匹配) |
| IN | 離散值集合查詢 | 有 | 高 |
善用 FIND_IN_SET 可避免 LIKE 的模糊匹配陷阱,但在高頻查詢大量資料時,建議將資料結構正規化為關聯表以獲得最佳效能。