MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例
1. 基本語法
FIND_IN_SET 函數(shù)的基本語法如下:
FIND_IN_SET(str, strlist)
參數(shù)說明:
- str:要查找的字符串
- strlist:用逗號(hào)分隔的字符串列表
返回值:
- 如果 str 在 strlist 中,返回 str 在 strlist 中的位置(從1開始)
- 如果 str 不在 strlist 中,返回 0
- 如果任意參數(shù)為 NULL,返回 NULL
2. 使用場景
FIND_IN_SET 主要用于以下場景:
- 查找逗號(hào)分隔的字符串列表中是否包含某個(gè)值
- 處理標(biāo)簽、分類等多值字段
- 實(shí)現(xiàn)多對(duì)多關(guān)系的簡單查詢
3. 實(shí)戰(zhàn)示例
3.1 基礎(chǔ)查詢示例
-- 創(chuàng)建測試表
CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(100),
tags VARCHAR(200)
);
-- 插入測試數(shù)據(jù)
INSERT INTO articles VALUES
(1, '深入理解MySQL', 'mysql,database,tech'),
(2, 'Python入門教程', 'python,programming,beginner'),
(3, '前端開發(fā)實(shí)踐', 'javascript,html,css');
-- 查找包含 'mysql' 標(biāo)簽的文章
SELECT * FROM articles
WHERE FIND_IN_SET('mysql', tags) > 0;
-- 查找包含多個(gè)標(biāo)簽之一的文章
SELECT * FROM articles
WHERE FIND_IN_SET('mysql', tags) > 0
OR FIND_IN_SET('python', tags) > 0;3.2 與其他函數(shù)結(jié)合使用
-- 結(jié)合 CASE 使用
SELECT
title,
CASE
WHEN FIND_IN_SET('tech', tags) > 0 THEN '技術(shù)類'
WHEN FIND_IN_SET('beginner', tags) > 0 THEN '入門類'
ELSE '其他'
END AS category
FROM articles;
-- 結(jié)合 COUNT 統(tǒng)計(jì)
SELECT
COUNT(*) as article_count,
SUM(FIND_IN_SET('mysql', tags) > 0) as mysql_count,
SUM(FIND_IN_SET('python', tags) > 0) as python_count
FROM articles;3.3 動(dòng)態(tài)條件查詢
-- 創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽搜索
DELIMITER //
CREATE PROCEDURE search_by_tags(IN tag_list VARCHAR(1000))
BEGIN
SET @sql = 'SELECT * FROM articles WHERE 1=1';
-- 分割輸入的標(biāo)簽
SET @tags = tag_list;
WHILE LENGTH(@tags) > 0 DO
SET @tag = SUBSTRING_INDEX(@tags, ',', 1);
SET @sql = CONCAT(@sql,
' AND FIND_IN_SET('', @tag, '', tags) > 0');
-- 移除已處理的標(biāo)簽
IF LOCATE(',', @tags) > 0 THEN
SET @tags = SUBSTRING(@tags, LOCATE(',', @tags) + 1);
ELSE
SET @tags = '';
END IF;
END WHILE;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
-- 調(diào)用存儲(chǔ)過程
CALL search_by_tags('mysql,tech');4. 性能考慮
使用 FIND_IN_SET 時(shí)需要注意以下幾點(diǎn):
索引限制:FIND_IN_SET 無法使用索引,對(duì)于大量數(shù)據(jù)的查詢可能會(huì)性能較差
替代方案:
- 對(duì)于簡單的單值查詢,可以使用 LIKE 配合通配符
- 考慮使用關(guān)聯(lián)表設(shè)計(jì),將多值字段規(guī)范化
- 使用專門的搜索引擎如 Elasticsearch
優(yōu)化建議:
- 限制字符串列表的長度
- 避免在頻繁查詢的場景使用
- 考慮使用緩存機(jī)制
5. 常見問題和解決方案
5.1 大小寫敏感問題
-- 使用 LOWER 或 UPPER 函數(shù)處理大小寫
SELECT * FROM articles
WHERE FIND_IN_SET(LOWER('MySQL'), LOWER(tags)) > 0;
5.2 空值處理
-- 處理 NULL 值和空字符串
SELECT * FROM articles
WHERE tags IS NOT NULL
AND tags != ''
AND FIND_IN_SET('mysql', tags) > 0;
5.3 模糊匹配
-- 結(jié)合 LIKE 實(shí)現(xiàn)模糊匹配
SELECT * FROM articles
WHERE tags LIKE CONCAT('%', 'mysql', '%')
OR FIND_IN_SET('mysql', tags) > 0;
6. 總結(jié)
FIND_IN_SET 是 MySQL 中處理分隔字符串的重要函數(shù),適合處理標(biāo)簽、分類等多值場景。雖然有性能局限,但在數(shù)據(jù)量較小或查詢頻率不高的情況下,它提供了一個(gè)簡單直接的解決方案。在使用時(shí)需要權(quán)衡性能需求,必要時(shí)考慮替代方案。
到此這篇關(guān)于MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例的文章就介紹到這了,更多相關(guān)mysql find_in_set函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)
- mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)詳解
- Mysql中find_in_set()函數(shù)用法詳解以及使用場景
- MySQL中find_in_set()函數(shù)用法示例詳解
- mysql中find_in_set函數(shù)的基本使用方法
- mysql中find_in_set()函數(shù)的使用及in()用法詳解
- mysql中find_in_set()函數(shù)的使用詳解
- mysql通過find_in_set()函數(shù)實(shí)現(xiàn)where in()順序排序
- MySQL的FIND_IN_SET函數(shù)使用方法分享
相關(guān)文章
mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決
死鎖和鎖等待是數(shù)據(jù)庫運(yùn)維中常見的問題,區(qū)別在于死鎖會(huì)自動(dòng)解除,而鎖等待需要手動(dòng)處理,本文就來介紹一下mysql死鎖(dead lock)與鎖等待(lock wait),感興趣的可以了解一下2024-09-09
MySQL生產(chǎn)庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程
這篇文章主要介紹了MySQL生產(chǎn)庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程,需要的朋友可以參考下2014-02-02
mysql下普通用戶備份數(shù)據(jù)庫時(shí)無lock tables權(quán)限的解決方法
mysql使用普通用戶備份出現(xiàn)無lock tables權(quán)限的解決方法,需要的朋友可以參考下。2011-10-10
MySQL實(shí)現(xiàn)類似于connect_by_isleaf的功能MySQL方法或存儲(chǔ)過程
這篇文章主要介紹了MySQL實(shí)現(xiàn)類似于connect_by_isleaf的功能MySQL方法或存儲(chǔ)過程,需要的朋友可以參考下2017-02-02
深入mysql存儲(chǔ)過程中表名使用參數(shù)傳入的詳解
本篇文章是對(duì)mysql存儲(chǔ)過程中表名使用參數(shù)傳入進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

