像LIKE一样在MySql中传输重音

时间:2018-03-09 01:20:03

标签: mysql

我有很长的用户列表。我想用名字的第一个字母对它们进行分组。如果第一个字母不是字母,则会将其归为#,因此我a-z + #最多有27个小组。

我想只展示gorup标签(例如F),如果它会有结果,我希望知道每个字母会有多少结果。所以我做了一个GROUP查询来统计所有组:

SELECT
  IF(lastname REGEXP '^[a-z]', UPPER(SUBSTRING(lastname, 1, 1)), '#') first_char,
  COUNT(1) num_users
GROUP BY first_char

这似乎有效,但使用REGEXP意味着Ö不是O,而是#。这是一个问题,因为LIKE确实找到'Ö' = 'O',所以当我O时它会在name LIKE 'O%'组中。我也可以在结果查询中使用REGEXP,但我宁愿在Ö下提交O

因此LIKE查询完美无缺,但GROUP查询并非如此。我如何完全比较期间LIKE做了什么?,因此组号和结果始终完全匹配。

还是另一种正确计算方式?

编辑1

LIKE a OR LIKE b OR .. OR LIKE z中使用IF甚至不起作用,因为该群组可能是Ö而不是O。这些数字是正确的,但群组标签不会。我真的需要转换......

编辑2

感谢@mpen。 lastname REGEXP '^[[:alpha:]]'短于26 LIKE,但Ö标签问题仍然存在。虽然在MySQL之外转换它很容易。

1 个答案:

答案 0 :(得分:2)

你可以像这样进行分组:

select
    IF(name REGEXP '^[[:alpha:]]', UPPER(SUBSTRING(name, 1, 1)), '#') first_char,
    COUNT(1) num_users
from _grouptest
group by first_char

然后删除您选择的脚本语言中的重音符号,或者如果您是勇敢的,则可以尝试在pure MySQL中删除它们。