Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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中查找最后一个字母数字值_Sql_Mysql_Sql Order By - Fatal编程技术网

在mysql中查找最后一个字母数字值

在mysql中查找最后一个字母数字值,sql,mysql,sql-order-by,Sql,Mysql,Sql Order By,我在mysql数据库中有一个包含用户名的字段 例如: 如果我按该字段DESC订购,我会得到: johndoe3 johndoe2 johndoe10 我需要得到: johndoe10 johndoe3 johndoe2 任何帮助感谢 < P>如果性能不是一个问题,考虑写一个,然后简单地包含在你的命令中的调用。< /P> SELECT * FROM MyTable ORDER BY CAST(strip_alpha(UserName) as int) DESC 对于一

我在mysql数据库中有一个包含用户名的字段 例如:

如果我按该字段
DESC
订购,我会得到:

johndoe3
johndoe2
johndoe10
我需要得到:

johndoe10
johndoe3
johndoe2 

<>任何帮助感谢

< P>如果性能不是一个问题,考虑写一个,然后简单地包含在你的命令中的调用。< /P>
 SELECT * 
 FROM MyTable
 ORDER BY 
      CAST(strip_alpha(UserName) as int) DESC
<>对于一个更高性能和无麻烦的解决方案,考虑将用户名中的数字提取到一个新的列中。然后,您可以通过以下方式轻松订购:

 SELECT *
 FROM MyTable
 WHERE  UserName LIKE 'johndoe%'
 ORDER BY TrailingDigit DESC

如果性能不是一个问题,考虑写A,然后简单地把你的订单中的调用包含在内。

 SELECT * 
 FROM MyTable
 ORDER BY 
      CAST(strip_alpha(UserName) as int) DESC
<>对于一个更高性能和无麻烦的解决方案,考虑将用户名中的数字提取到一个新的列中。然后,您可以通过以下方式轻松订购:

 SELECT *
 FROM MyTable
 WHERE  UserName LIKE 'johndoe%'
 ORDER BY TrailingDigit DESC

这是一个巨大的黑客,但我认为会奏效。如果您的列名为s:

order by 
  (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(s, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', ''),
  length(s) desc,
  s desc

首先按文本的字母部分进行排序,将所有相同的名称放在一起,然后按长度大致按数字排序,然后按s排序。最后一个按s排序的
现在可以正常工作了,因为它只用于消除相同数字的相同名称之间的歧义。

这是一个巨大的黑客攻击,但我认为会奏效。如果您的列名为s:

order by 
  (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(s, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', ''),
  length(s) desc,
  s desc

首先按文本的字母部分进行排序,将所有相同的名称放在一起,然后按长度大致按数字排序,然后按s排序。最后一个按s排序的
现在可以正常工作,因为它只用于消除具有相同位数的相同名称之间的歧义。

您当前使用的字符编码和排序规则是什么?没有控制字符将字符串与数字分开,要可靠地检索用于排序的数值是非常困难的。IE:
RIGHT(字段,1)
将返回“0”而不是“10”…您不能填充这些数字(例如:johndoe2变为johndoe2)?或者将它们存储在不同的列中?@NullUserException:那么当您在100年代、1000年代等获得#时,您必须重新访问填充。MySQL支持正则表达式,但它非常有限-没有正则表达式子字符串可以完成这一短时间的工作。@OMG,只需填充到您熟悉的大小。您当前使用的字符编码和排序规则是什么?如果没有将字符串与数字分隔的控制字符,则很难可靠地检索数字值进行排序。IE:
RIGHT(字段,1)
将返回“0”而不是“10”…您不能填充这些数字(例如:johndoe2变为johndoe2)?或者将它们存储在不同的列中?@NullUserException:然后当你在100年代、1000年代等获得#时,你必须重新访问填充。MySQL支持正则表达式,但它非常有限-没有正则表达式子字符串可以使这一短时间工作。@OMG好吧,只需填充到你满意的大小即可。