FIND_IN_SET 函数的基本语法如下:
FIND_IN_SET(str, strlist)
参数说明:
返回值:
FIND_IN_SET 主要用于以下场景:
-- 创建测试表CREATETABLE articles (
id INTPRIMARYKEY,
title VARCHAR(100),
tags VARCHAR(200));-- 插入测试数据INSERTINTO articles VALUES(1,'深入理解MySQL','mysql,database,tech'),(2,'Python入门教程','python,programming,beginner'),(3,'前端开发实践','javascript,html,css');-- 查找包含 'mysql' 标签的文章SELECT*FROM articles
WHERE FIND_IN_SET('mysql', tags)>0;-- 查找包含多个标签之一的文章SELECT*FROM articles
WHERE FIND_IN_SET('mysql', tags)>0OR FIND_IN_SET('python', tags)>0;
-- 结合 CASE 使用SELECT
title,CASEWHEN FIND_IN_SET('tech', tags)>0THEN'技术类'WHEN FIND_IN_SET('beginner', tags)>0THEN'入门类'ELSE'其他'ENDAS category
FROM articles;-- 结合 COUNT 统计SELECTCOUNT(*)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;
-- 创建存储过程实现动态标签搜索DELIMITER//CREATEPROCEDURE search_by_tags(IN tag_list VARCHAR(1000))BEGINSET@sql='SELECT * FROM articles WHERE 1=1';-- 分割输入的标签SET@tags= tag_list;WHILE LENGTH(@tags)>0DOSET@tag= SUBSTRING_INDEX(@tags,',',1);SET@sql= CONCAT(@sql,' AND FIND_IN_SET(\'',@tag,'\', tags) > 0');-- 移除已处理的标签IF LOCATE(',',@tags)>0THENSET@tags= SUBSTRING(@tags, LOCATE(',',@tags)+1);ELSESET@tags='';ENDIF;ENDWHILE;PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATEPREPARE stmt;END//DELIMITER;-- 调用存储过程CALL search_by_tags('mysql,tech');
使用 FIND_IN_SET 时需要注意以下几点:
索引限制:FIND_IN_SET 无法使用索引,对于大量数据的查询可能会性能较差
替代方案:
优化建议:
-- 使用 LOWER 或 UPPER 函数处理大小写SELECT*FROM articles
WHERE FIND_IN_SET(LOWER('MySQL'), LOWER(tags))>0;
-- 处理 NULL 值和空字符串SELECT*FROM articles
WHERE tags ISNOTNULLAND tags !=''AND FIND_IN_SET('mysql', tags)>0;
-- 结合 LIKE 实现模糊匹配SELECT*FROM articles
WHERE tags LIKE CONCAT('%','mysql','%')OR FIND_IN_SET('mysql', tags)>0;
FIND_IN_SET 是 MySQL 中处理分隔字符串的重要函数,适合处理标签、分类等多值场景。虽然有性能局限,但在数据量较小或查询频率不高的情况下,它提供了一个简单直接的解决方案。在使用时需要权衡性能需求,必要时考虑替代方案。
提示:请勿发布广告垃圾评论,否则封号处理!!