2016-01-13 136 views
0

我正在为新货车系统创建一个选择和包装列表,因为这条路线是最优的,我需要根据我们的产品行的顺序对SKU列表进行排序。第一个字母,或前两个字母表示仓库中的位置。Mysql - priotize按数字排序的字母排序

因此,有这个名单从排序是这样的:

ORDER BY IF(sku RLIKE '^[a-z]', 1, 2), sku ASC; 
+-------------+ 
| sku   | 
+-------------+ 
| A3-1-1195 | 
| A3-1-1195 | 
| AA6-8-7117 | 
| AB10-7-6405 | 
| AB10-7-6405 | 
| AB4-4-3487 | 
| AB5-6-3460 | 
| AB6-3-3445 | 
| C1-8-5623 | 
| K1-4-1835 | 
| O7-7-4737 | 
| O8-7-4344 | 
| O8-7-4344 | 
| U1-8-6664 | 
+-------------+ 

编辑:如果所有的数字排序第一优先,然后是数字

我理想中的结果将是。尽管如此,如果第二个字符是数字,它应该按字母顺序排序。

+-------------+ 
| sku   | 
+-------------+ 
| AB4-4-3487 | 
| AB5-6-3460 | 
| AB6-3-3445 | 
| AB10-7-6405 | 
| AB10-7-6405 | 
| AA6-8-7117 | 
| A3-1-1195 | 
| A3-1-1195 | 
| C1-8-5623 | 
| K1-4-1835 | 
| O7-7-4737 | 
| O8-7-4344 | 
| O8-7-4344 | 
| U1-8-6664 | 
+-------------+ 

回答

0

你可以尝试你的领域分成5个领域: NP =您的位置字段 位置=位置CHAR(S) N1的大小=第一号 N2 =第二号 N3 =第三号码

和sonrt与这些领域。 继承人没有表连接(用于测试在查询浏览器中与您的数据)一个例子:

SELECT 
    sku, 
    MID(sku, 1, np) AS position, 
    REPLACE(MID(sku, np+1, 2), '-', '') AS n1, 
    REPLACE(MID(sku, np+3, 2), '-', '') AS n2, 
    REPLACE(MID(sku, np+5, LENGTH(sku)), '-', '') AS n3 
FROM (
    SELECT 
     IF(MID(sku, 2, 1) REGEXP '[0-9]', 1, 2) AS np, 
     s.* 
    #subquery for this test 
    FROM (
     SELECT 'A3-1-1195' AS sku 
     UNION ALL SELECT 'A3-1-1195' 
     UNION ALL SELECT 'AA6-8-7117' 
     UNION ALL SELECT 'AB10-7-6405' 
     UNION ALL SELECT 'AB10-7-6405' 
     UNION ALL SELECT 'AB4-4-3487' 
     UNION ALL SELECT 'AB5-6-3460' 
     UNION ALL SELECT 'AB6-3-3445' 
     UNION ALL SELECT 'C1-8-5623' 
     UNION ALL SELECT 'K1-4-1835' 
     UNION ALL SELECT 'O7-7-4737' 
     UNION ALL SELECT 'O8-7-4344 ' 
     UNION ALL SELECT 'O8-7-4344' 
     UNION ALL SELECT 'U1-8-6664') as s 
) AS s 
ORDER BY np DESC, position, n1, n2, n3 
+0

感谢您的答复! :-)我已经更新了我的目标,以反映第二个字符应该在alfabetical desc中排序。如果一个数字。 –