我有很长的用户列表。我想用名字的第一个字母对它们进行分组。如果第一个字母不是字母,则会将其归为#
,因此我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之外转换它很容易。
答案 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中删除它们。
Str::removeDiacritics
来自我的PHP库ptilz,它来自WordPress