我有一个名为用户的列。我有这样的字段:user1,user2,...,user10,user11,user12,user20。但是字段并不总是以用户
开头我想向上排序这些字段,即我正在执行以下查询:
SELECT * FROM table ORDER BY user ASC
此查询返回: user1,user10,user11,user12,user2,user20
我想要的排序如下: user1,user2,user11,user12,user20
我该怎么做?我正在使用的编程语言是php
答案 0 :(得分:1)
您可以使用PHP的自然排序功能natsort()
- 使用“自然顺序”算法对数组进行排序。
答案 1 :(得分:1)
最好添加另一个包含用户位置的列,然后按该列排序。但是如果你不能改变你的表结构,这样的查询应该以正确的顺序返回你的行:
SELECT
tablename.*
FROM
tablename
ORDER BY
SUBSTR(user,
LEAST(
CASE WHEN LOCATE('0', user)>0 THEN LOCATE('0', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('1', user)>0 THEN LOCATE('1', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('2', user)>0 THEN LOCATE('2', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('3', user)>0 THEN LOCATE('3', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('4', user)>0 THEN LOCATE('4', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('5', user)>0 THEN LOCATE('5', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('6', user)>0 THEN LOCATE('6', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('7', user)>0 THEN LOCATE('7', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('8', user)>0 THEN LOCATE('8', user) ELSE LENGTH(user) END,
CASE WHEN LOCATE('9', user)>0 THEN LOCATE('9', user) ELSE LENGTH(user) END
)) + 0
请参阅小提琴here。
答案 2 :(得分:0)
您需要使用函数提取数字,然后按
排序SELECT * FROM table ORDER BY numeric(user) ASC
这里是一个快速的(从规范化函数修改)
CREATE FUNCTION `numeric`(`str` VARCHAR(255) )
RETURNS varchar(255) CHARSET utf8
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret VARCHAR(255) DEFAULT '';
DECLARE c VARCHAR(1);
SET len = CHAR_LENGTH( str );
REPEAT
BEGIN
SET c = MID( str, i, 1 );
IF c REGEXP '[[:digit:]]' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
RETURN ret;
END
答案 3 :(得分:0)
尝试使用CAST
SELECT * FROM table ORDER BY CAST(SUBSTRING(user, 5) AS unsigned)
检查sqlfiddle http://sqlfiddle.com/#!2/5f307c/1
答案 4 :(得分:0)
如果数据包含单词user with number
,则可以使用Mysql的SUBSTRING_INDEXSELECT
*
FROM
TABLE
ORDER BY SUBSTRING_INDEX(`user`, 'user', - 1) ASC
答案 5 :(得分:0)