如何将Mysql ASC命令1,2,3,4,5而不是1,10,11,12?

时间:2018-10-19 09:14:35

标签: mysql sql-order-by

这是我的查询

$sql=executeQuery("select * from ".PREFIX."frame_info 
                   where Id='".$Id."' $where_clause 
                   order by left(FName, 2), substr(FName, 3) + 0, FName");

PS。我尝试了以下方法,但没有任何作用

  1. cast(FName为未签名)ASC
  2. FName + 0
  3. LENGTH(FName),FName

以下是示例数据:

Rayban Slim Fit 5,
Rayban Slim Fit 6,
Rayban Slim Fit 7,
Rayban Slim Fit 3,
Rayban Slim Fit 2,
Rayban Slim Fit 1,
Rayban Slim Fit 9,
Rayban Slim Fit 8,
Rayban Slim Fit 10,
Rayban Princess 149,
Rayban Princess 146,
Rayban Princess 118,
Rayban Princess 147,
Rayban 3141,
Rayban 3143,
Rayban 3153,
Rayban 3152,
Rayban 3130,
Rayban 3128

预期结果:

Rayban 3128,
Rayban 3130,
Rayban 3141,
Rayban 3143,
Rayban 3152,
Rayban 3153,
Rayban Princess 118,
Rayban Princess 146,
Rayban Princess 147,
Rayban Princess 149,
Rayban Slim Fit 1,
Rayban Slim Fit 2,
Rayban Slim Fit 3,
Rayban Slim Fit 5,
Rayban Slim Fit 6,
Rayban Slim Fit 7,
Rayban Slim Fit 8,
Rayban Slim Fit 9,
Rayban Slim Fit 10

1 个答案:

答案 0 :(得分:1)

  • 我们可以将Substring_Index()函数与Delimiter一起用作单个空格字符(' ')。 -1将使我们能够从FName的末端到第一次出现空间(从右到左)。
  • 现在,我们可以使用CAST(.. AS UNSIGNED)将数字子字符串转换为整数。
  • Replace()函数与Trim()一起使用,以获取基本名称(不带数字后缀的字符串)。
  • 现在,只需先输入Order By基名,然后再输入后缀号(“序列号”)

尝试以下查询( DB Fiddle DEMO ):

SELECT Cast(Substring_index(fi.fname, ' ', -1) AS UNSIGNED) AS serial_number,
       Trim(REPLACE(fi.fname, Substring_index(fi.fname, ' ', -1), '')) AS
       FName_without_serialno, 
       fi.*
FROM   frame_info AS fi
ORDER  BY fname_without_serialno,
          serial_number