从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
您要降序或升序的列放在“中,您可以创建一个函数来隔离您要按其排序的数字。像这样的东西(在这里找到)
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
$$