2014-01-07 104 views
2

我有一个名为的用户。我有这样的字段:user1,user2,...,user10,user11,user12,user20。但字段并不总是由用户向上排列表中的字段mysql

开始我想这些字段排序向上,也就是说,我做了以下查询:

SELECT * FROM table ORDER BY user ASC 

该查询将返回: USER1,user10,user11,USER12,用户2 ,user20

而且那种我想要的是以下几点: 用户1,用户2,user11,USER12,user20

我该怎么做这种?我正在使用的编程语言是php

+0

是所有的字段都包含'用户',然后是一个数字? –

+0

ORDER BY user + 0; – Strawberry

+0

否Saharsh Shah –

回答

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

+0

字段并非总是以用户开始:/ –

+1

@pc_oc是的,用户是列名,所以它应该没问题,请参阅http://sqlfiddle.com/#!2/4d8ad/1 – fthiella

+0

谢谢!是工作。震惊:) –

1

您可以使用PHP的自然排序功能natsort() - 使用“自然顺序”算法对数组进行排序。

+0

好的,我会尝试使用natsort() –

+0

如何才能为该列使用natsort?查询 –

0

你需要提取与函数的数量,并进行排序,最后

SELECT * FROM table ORDER BY numeric(user) ASC 

这里有一个快速(从标准化FUNC修改)

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 
0

试试这个使用CAST

SELECT * FROM table ORDER BY CAST(SUBSTRING(user, 5) AS unsigned) 

查看sqlfiddle http://sqlfiddle.com/#!2/5f307c/1

+0

结果为:user1,user10,user2,user11等 –

+0

编辑请检查现在 –

+0

与上面相同的结果 –

0

您可以使用MySQL的SUBSTRING_INDEX如果数据包含有数目字用户

SELECT 
    * 
FROM 
    TABLE 
ORDER BY SUBSTRING_INDEX(`user`, 'user', - 1) ASC 
+0

字段可能有不同的名称和数字并不总是有 –

0

如何在这里约

SELECT * FROM test ORDER BY 
    LPAD(lower(user), 10,0) ASC 

检查

http://sqlfiddle.com/#!2/e49f2/16

+0

但不是字段并不总是以相同的方式开始。可以以其他字符开头 –