在mysql中按列排序,值为多个小数点

时间:2017-06-01 11:11:32

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

请参阅下面的表格数据:

enter image description here

我希望main_module的结果顺序为

1
2
3
3.1
3.2
3.2.1
3.2.2
3.3
3.4
4
4.1
4.1.1
4.2

3 个答案:

答案 0 :(得分:2)

这是一个黑客攻击。但是,它应该适用于您可能遇到的大多数情况......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (string VARCHAR(12) NOT NULL PRIMARY KEY);

INSERT INTO my_table VALUES
('1'),
('2'),
('3'),
('3.1'),
('3.2'),
('3.2.1'),
('3.21.2'),
('3.3'),
('3.4'),
('4'),
('4.1'),
('4.1.1'),
('4.2');

SELECT *
  FROM my_table
 ORDER 
    BY INET_ATON(REPLACE(TRIM(RPAD(string,8,' 0')),' ','.'));

    +--------+
    | string |
    +--------+
    | 1      |
    | 2      |
    | 3      |
    | 3.1    |
    | 3.2    |
    | 3.2.1  |
    | 3.3    |
    | 3.4    |
    | 3.21.2 |
    | 4      |
    | 4.1    |
    | 4.1.1  |
    | 4.2    |
    +--------+

答案 1 :(得分:1)

这是一种方式:

order by substring_index(main_module, '.', 1) + 0,
         substring_index(substring_index(main_module, '.', 2), '.', -1) + 0,
         substring_index(substring_index(main_module, '.', 3), '.', -1) + 0

这将从模块中提取每个数字并将其用于排序。

答案 2 :(得分:1)

我尝试了一种方法,其中字符串中.的可用性。我也使用了Gordon Linoff's逻辑。

SELECT main_module,
    (CASE DotLen WHEN 0 THEN main_module 
                 WHEN 1 THEN substring_index(substring_index(main_module, '.', 1), '.', -1) 
                 WHEN 2 THEN substring_index(substring_index(main_module, '.', 1), '.',  1) ELSE 0 END * 1 ) AS D1,
    (CASE DotLen WHEN 1 THEN substring_index(substring_index(main_module, '.', 2), '.', -1) 
                 WHEN 2 THEN substring_index(substring_index(main_module, '.', 2), '.', -1) ELSE 0 END * 1 ) AS D2,
    (CASE DotLen WHEN 2 THEN substring_index(substring_index(main_module, '.', 3), '.', -1) ELSE 0 END * 1 ) AS D3
FROM (
    SELECT  *, LENGTH(main_module) - LENGTH(REPLACE(main_module, '.', '')) AS DotLen
    FROM `NumericCheck`
) AS R
ORDER BY D1, D2, D3;

您可以通过添加另一个子查询来跳过select中的计算值。

对于样本,我也尝试了两位小数,它工作正常。

工作演示:http://rextester.com/ONNX5810