按字符串和数字排序Mysql

时间:2013-07-13 03:48:35

标签: mysql sorting

我有3个字段,例如标题名称尺寸 我正在尝试对字符串列(包含数字)进行排序。

+-----------------+--------------+-------------------+
+----- title -----+---- name ----+-------size--------+
+-----------------+--------------+-------------------+
+     SPR-235     + SPR 235      + 118 x 118 x 43 mm +
+     SPR-355-D   + SPR 355 D    + 140 x 140 x 41 mm +
+     SPR-355-K   + SPR 355 K    + 140 x 140 x 41 mm +
+     SPR-415     + SPR 415      + 155 x 155 x 50 mm +
+     SPR-455-K   + SPR 455 K    + 138 x 138 x 64 mm +
+     SPR-455-D   + SPR 455 D    + 138 x 138 x 64 mm +
+     SPR-135     + SPR 135      + 60 x 60 x 82 mm   +

我使用了这个查询:

SELECT title,name FROM table ORDER BY CAST(SUBSTRING(name,LOCATE('',name)+1)AS SIGNED)

它的工作原理如下:

+-----------------+--------------+
+----- title -----+---- name ----+
+-----------------+--------------+
+     SPR-135     + SPR 135      +
+     SPR-235     + SPR 235      +
+     SPR-355-D   + SPR 355 D    + <-- see
+     SPR-355-K   + SPR 355 K    + <-- see
+     SPR-415     + SPR 415      +
+     SPR-455-D   + SPR 455 D    + <-- see
+     SPR-455-K   + SPR 455 K    + <-- see

但是当我将查询更改为:

SELECT * FROM table ORDER BY CAST(SUBSTRING(名称,LOCATE('',名称)+1)AS SIGNED)

不幸的是,“D”和“K”未能排序。并显示如下:

+-----------------+--------------+-------------------+
+----- title -----+---- name ----+-------size--------+
+-----------------+--------------+-------------------+
+     SPR-135     + SPR 135      + 60 x 60 x 82 mm   +
+     SPR-235     + SPR 235      + 118 x 118 x 43 mm +
+     SPR-355-D   + SPR 355 D    + 140 x 140 x 41 mm + <-- see
+     SPR-355-K   + SPR 355 K    + 140 x 140 x 41 mm + <-- see
+     SPR-415     + SPR 415      + 155 x 155 x 50 mm +
+     SPR-455-K   + SPR 455 K    + 138 x 138 x 64 mm + <-- see
+     SPR-455-D   + SPR 455 D    + 138 x 138 x 64 mm + <-- see

我想首先排序“D”然后排序“K”。 非常感谢帮助解决这个问题:)

2 个答案:

答案 0 :(得分:2)

获取数字部分,然后从字符串中获取最后一个字符,并且两个顺序的顺序应该有效。

  SELECT name 
    FROM myTable 
ORDER BY CAST(SUBSTRING(name,LOCATE(' ',name)+1) AS SIGNED), 
         SUBSTRING(name,-1);

Live DEMO.

答案 1 :(得分:-1)

通过在字符9中包含子字符串(如果存在),为您的订单添加另一个子句。

ORDER BY CAST(SUBSTRING(name,LOCATE(' ',name)+1) AS SIGNED), 
         SUBSTRING(name,9,1)