Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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中的同一列按文本asc和数字desc排序字符串_Mysql_Sorting - Fatal编程技术网

从mysql中的同一列按文本asc和数字desc排序字符串

从mysql中的同一列按文本asc和数字desc排序字符串,mysql,sorting,Mysql,Sorting,我想订一套这样的: a 2 a 1 b 9 与正常的升序不同: a 1 a 2 b 9 换句话说,我有一列文字,有时还有一个数字在结尾。我希望所有字段的末尾都有一个数字,按数字降序排列,但前导文本仍必须按升序排列 字符串的长度不仅为1个字符,而且长度未知,数字的长度也不仅为1个字符,而且长度未知,并且不能保证位于字符串的末尾。它可能看起来像:“随机事件,第12次” 如果我有一个类似“Random event,12th time”的字符串,我希望它出现在结果中的“Random event,

我想订一套这样的:

  • a 2
  • a 1
  • b 9
与正常的升序不同:

  • a 1
  • a 2
  • b 9
换句话说,我有一列文字,有时还有一个数字在结尾。我希望所有字段的末尾都有一个数字,按数字降序排列,但前导文本仍必须按升序排列

字符串的长度不仅为1个字符,而且长度未知,数字的长度也不仅为1个字符,而且长度未知,并且不能保证位于字符串的末尾。它可能看起来像:“随机事件,第12次”

如果我有一个类似“Random event,12th time”的字符串,我希望它出现在结果中的“Random event,11th time”之前

希望有一些SQL人员知道这个问题的答案:)

或者,如果使用“dec”
您要降序或升序的列放在“

中,您可以创建一个函数来隔离您要按其排序的数字。像这样的东西(在这里找到)

DROP函数(如果存在条带\u非\u数字);
分隔符$$
创建功能条非数字(输入VARCHAR(255))
返回整数
确定性
开始
声明输出VARCHAR(255)默认值“”;
声明迭代器INT默认值为1;
而迭代器<(长度(输入)+1)执行
如果子字符串(输入,迭代器,1)位于('0','1','2','3','4','5','6','7','8','9'),则
设置输出=CONCAT(输出,子字符串(输入,迭代器,1));
如果结束;
SET iterator=迭代器+1;
结束时;
返回输出;
结束
$$
现在按如下方式运行sql:


按myString从myTable order中选择*,STRIP_NON_DIGIT(myString)DESC

如果你有
随机事件,12世纪,12世纪
,那一定是在
随机事件,12世纪,11世纪
?有趣的问题,不知道。什么是
“你的查询”
?什么是
和“
”?你没有将它与任何东西进行比较?和
按顺序
什么从
条目中选择
msg
id
nick
date
,其中
ctg
=?订购依据
id
DESC LIMIT 15 OFFSET?”;我不认为你所建议的是解决我问题的方法。请再次阅读我的帖子和下面的评论,或者向我解释为什么这可以解决我的问题。
select * from table name where "your query " and  "  " order by asc;
DROP FUNCTION IF EXISTS STRIP_NON_DIGIT;
DELIMITER $$
CREATE FUNCTION STRIP_NON_DIGIT(input VARCHAR(255))
   RETURNS INT
   DETERMINISTIC
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      SET iterator = iterator + 1;
   END WHILE;
   RETURN output;
END
$$