Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 排序用户名_Mysql_Sql_Database - Fatal编程技术网

Mysql 排序用户名

Mysql 排序用户名,mysql,sql,database,Mysql,Sql,Database,如何正确排序用户名 例如,我执行以下查询: 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 等等 SELECT * FROM `member

如何正确排序用户名

例如,我执行以下查询:

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
等等

SELECT *
FROM `members`
WHERE username LIKE 'bx%'
ORDER BY LENGTH(username), username
您需要这样做的事实告诉我您的模式是非规范化的。如果可能,如果需要对用户名进行操作,请将用户名的整数部分存储在单独的列中


如果短语bx是固定的

SELECT * FROM  `members` WHERE username LIKE  'bx%' 
ORDER BY replace(username,'BX','')*1 ASC  

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

  • 从最后一个字符开始,遍历传递的字符串 一个字符接一个字符(位置递减),直到第一个非 找到数字字符。(C)
  • 获取数字部分(4)的长度
  • 将多个“0”字符添加到的数字部分 字符串(这决定了处理的数字部分的最大大小) 给出(例如)00001234
  • 由字符串的非数字部分作为前缀 给出ABC00001234
  • 输出
按输出排序
您还可以添加一个计算字段(使用刚刚创建的函数),该字段将给出返回的值并在其上创建索引。

ooh,我喜欢这个答案+1但是如果还有一个用户名bxa1,会发生什么呢?它将在
bx1
bx123
之间订购。。。也许不是OP想要的?@eggyal是的,你需要一个自定义函数来进行自然排序。@RedFilter使用大写看起来更好haha@NikolaK. 看起来像是在对我大喊大叫……好像那是一场军备竞赛战争,对答案没有多大帮助。谢谢!我已经有了一个成员id(PK)字段。。我只需要为报告页面订购
bx*
用户名。。谢谢:)哇,我得到了选票。。。我想知道为什么?这是一个通用的问题,适用于广泛的观众,以一种清晰简洁的方式提出。
SELECT * FROM  `members` WHERE username LIKE  'bx%' 
ORDER BY replace(username,'BX','')*1 ASC