在表中向上排序mysql的字段

时间:2014-01-07 11:10:14

标签: php mysql sql select sql-order-by

我有一个名为用户的列。我有这样的字段: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

6 个答案:

答案 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_INDEX
SELECT 
  * 
FROM
  TABLE 
ORDER BY SUBSTRING_INDEX(`user`, 'user', - 1) ASC 

答案 5 :(得分:0)

怎么样

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

点击这里

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