我的数据库中有用户名,如abc,abc1,abc2,abc3。 我想退役名字abc3。 我的查询是: 从用户中选择用户名,其中REGEXP'^ abc [0-9] * $'按用户ID限制0,1。
详细说明: - 我必须获取名称以abc开头的用户,之后必须只有数字。并且在abc之后拥有最大数字的那个人必须找到它。我知道最大的用户ID将在abc后拥有最大的数字。所以我必须找到所有用户使用用户名策略与abc,然后包含digiits。
我必须应用此逻辑来创建自定义用户名。例如,如果用户名是ab而lastname是cat。然后用户名将是abc。如果数据库中存在abc,则用户名将为abc1。如果数据库中存在abc1,则用户名将为abc2.so on ...
如何重写我的查询以使其更快。
答案 0 :(得分:0)
您可以使用LIKE查询。 LIKE 'abc%'
。
答案 1 :(得分:0)
如果您确定第一个字符只是字母,之后只是数字,那么您可以尝试:
select max(cast(substr(username, length('abc')) as int)) as 'number' from user where username like 'abc%'
但是,如果可能有像abc1def0
这样的用户,这不会起作用,因为这会在上面的查询中返回数字10(当mysql将字符串转换为整数时,它会丢弃任何不是数字的内容然后转换结果)。
如果您还没有用户名列,也应该为其创建一个索引。
更新
如果您有更大的文字部分,例如abcd11
,则无法使用此功能,因为您需要额外检查,例如where username like 'abc%' and length(username)=length( cast(substr(username, length('abc')) as int))
。
但这可能不比正则表达式快......