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

