2014-01-07 23 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

但不是字段並不總是以相同的方式開始。可以以其他字符開頭 –