You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:56:14