MySQL 8.0中FIND_IN_SET函数未生效问题排查
MySQL查询无法排除Path包含特定值的分类
我在MySQL 8.0中执行如下SQL查询,意图排除Path列包含'11589459'的分类:
SELECT c.Id AS Id, ct.Title AS Title, cu.Url AS Url, c.ImageUrl AS ImageUrl FROM categories c JOIN categorymodelproductmodel pcm ON c.Id = pcm.CategoriesId INNER JOIN products p ON pcm.ProductsId = p.Id INNER JOIN categorytitles ct ON c.Id = ct.CategoryId INNER JOIN categoryurls cu ON c.Id = cu.CategoryId WHERE c.Type = 'category' AND FIND_IN_SET('11589459', c.Path) = 0 AND p.BrandId = 167300 AND p.IsVisible = 1 AND ct.Language = 'Pl' AND cu.Language = 'Pl' AND NOT EXISTS ( SELECT 1 FROM categories c2 JOIN categorytitles ct2 ON c2.Id = ct2.CategoryId WHERE ct2.Title = ct.Title AND c2.Id <> c.Id ) GROUP BY c.Id, ct.Title, cu.Url, c.ImageUrl;
categories表的Path列示例值为:
1052820, 2753794, 1050568。但查询结果仍返回了Path包含'11589459'的分类,请问哪里操作错误?
问题原因与解决办法
错误原因:
FIND_IN_SET()函数要求逗号分隔的字符串中没有额外空格,它会将每个逗号分隔的元素当作完整字符串匹配。而你的Path列中每个元素前都带有空格(比如11589459实际存储为11589459),导致FIND_IN_SET('11589459', c.Path)无法匹配到该值,自然无法排除对应的分类。解决方案1:查询时临时清理空格
用REPLACE()函数去掉Path列中的所有空格,再使用FIND_IN_SET():AND FIND_IN_SET('11589459', REPLACE(c.Path, ' ', '')) = 0解决方案2:使用LIKE精准匹配带空格的元素
如果不想修改原数据格式,可以通过拼接边界字符串避免部分匹配,确保只匹配完整的目标元素:AND NOT CONCAT(', ', c.Path, ', ') LIKE '%, 11589459, %'长远优化方案
建议将Path列的存储格式统一改为无空格的逗号分隔字符串(比如1052820,2753794,1050568),这样后续使用FIND_IN_SET()或其他字符串函数时不会出现匹配问题,也能提升查询效率。
内容的提问来源于stack exchange,提问作者AlexeyOrel
相关产品推荐
相关产品推荐

