6

如何正确排序用户名?

例如我做这个查询:

SELECT * FROM  `members` WHERE username LIKE  'bx%' ORDER BY username ASC 

结果

bx1
bx10
bx11
bx12
bx13
bx14
bx15
bx16
bx17
bx18
bx19
bx2
bx20
bx21
bx3
bx4
bx5

我想这样返回:

bx1
bx2
bx3
bx4
bx5
...
bx15
bx16

等等

4

4 回答 4

11
SELECT *
FROM `members`
WHERE username LIKE 'bx%'
ORDER BY LENGTH(username), username

你需要这样做的事实告诉我你的模式是非规范化的。如果可能,如果需要对其进行操作,请将用户名的整数部分存储在单独的列中。

SQL 小提琴示例

于 2012-07-23T12:54:27.367 回答
1

您需要创建一个用户定义的函数,该函数接受字符串并返回扩展字符串。假设是:字符串仅包含一个位于末尾的数字组件,并且小于由 fn 中的填充确定的最大整数大小 例如 ABC1234 -> ABC00001234 ABC34 -> ABC00000034 实施以下步骤

  • 从最后一个字符开始,逐个字符(递减位置)遍历传递的字符串,直到找到第一个非数字字符。(C)
  • 获取数字部分的长度 (4)
  • 将多个“0”字符添加到字符串的数字部分(这决定了处理的数字部分的最大大小)给出(例如)00001234
  • 以字符串的非数字部分为前缀,给出 ABC00001234
  • 输出

按输出排序您还可以添加一个计算字段(它使用刚刚创建的函数),它将返回该值并在其上创建一个索引。

于 2012-07-23T13:19:43.437 回答
0
SELECT * FROM  `members` 
WHERE username LIKE  'bx%' 
ORDER BY cast(substring(username, 3) as unsigned) ASC
于 2012-07-23T12:55:04.457 回答
0

如果短语 bx 是固定的,

SELECT * FROM  `members` WHERE username LIKE  'bx%' 
ORDER BY replace(username,'BX','')*1 ASC  
于 2012-07-23T12:55:53.770 回答