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

如何用MySQL统计姓名中大小写敏感的重复字符?

完善后的MySQL查询方案

你的递归CTE思路方向是对的,但有几个细节需要调整来精准匹配需求,比如大小写敏感的严格区分、重复次数的筛选逻辑、列名别名以及结果排序逻辑。这里是修正后的完整查询:

WITH RECURSIVE CTE AS (
    -- 初始步骤:拆分第一个字符并记录其在姓名中的位置
    SELECT 
        firstname,
        SUBSTRING(firstname, 1, 1) AS Letter,
        1 AS Position,
        SUBSTRING(firstname, 2) AS Remainder
    FROM empl 
    WHERE LENGTH(firstname) > 1
    
    UNION ALL
    
    -- 递归拆分剩余字符,位置逐次递增
    SELECT 
        firstname,
        SUBSTRING(Remainder, 1, 1) AS Letter,
        Position + 1,
        SUBSTRING(Remainder, 2) AS Remainder
    FROM CTE 
    WHERE LENGTH(Remainder) > 0
)
-- 统计并筛选符合要求的重复字符
SELECT 
    firstname AS `firstname,x`,
    Letter AS `str,y`,
    COUNT(*) AS `cnt,z`
FROM CTE
GROUP BY firstname, Letter, ASCII(Letter)  -- 用ASCII值严格区分大小写字符
HAVING COUNT(*) >= 2  -- 包含出现2次及以上的重复字符
ORDER BY firstname, MIN(Position);  -- 按姓名分组,同一姓名下按字符首次出现顺序排序

关键修改点说明:

  1. 添加RECURSIVE关键字:MySQL 8.0及以上版本的递归CTE必须声明RECURSIVE,否则会触发语法错误。
  2. 追踪字符位置:新增Position字段记录每个字符在姓名中的位置,后续排序时可以让最左侧的重复字符优先显示,完美匹配你给出的示例输出顺序。
  3. 调整筛选条件:把原查询的COUNT(Letter)>2改为COUNT(*)>=2,这样会包含出现2次的重复字符(比如Arbaaz里的a),覆盖需求里的所有场景。
  4. 严格区分大小写:通过ASCII(Letter)加入分组条件,确保大写和小写字符(比如C和c)被视为完全不同的字符统计,满足大小写敏感的要求。
  5. 匹配需求列名:给查询结果列设置别名firstname,x、str,y、cnt,z,完全贴合你期望的输出格式。
  6. 优化结果排序:通过ORDER BY firstname, MIN(Position)让结果按姓名分组,同一姓名下的重复字符按首次出现顺序排列,逻辑更清晰。

这个查询会输出你需要的所有行:每个重复的大小写敏感字符单独成一行,显示对应的姓名、字符和出现次数。

内容的提问来源于stack exchange,提问作者mysqlrockstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:09:09