Sorting/ordering in MySQL

前端 未结 3 1910
一生所求
一生所求 2021-01-14 05:26

I\'m having a little problem with trying to sort the contents of a table programs by the column prog_id which holds the id of each program in the f

相关标签:
3条回答
  • 2021-01-14 05:59

    You could use 3 fields e.g. major_version, minor_version, build_number, make them integer fields and use mysqls buildin "ORDER BY major_version,minor_version,build_number" which will order the fields in the desired way.

    0 讨论(0)
  • 2021-01-14 06:08

    You could split them into their constituent parts like:

    SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 1),
           LENGTH(SUBSTRING_INDEX(prog_id, '.', 1 -1)) + 1),
           '.', '') AS id1,
           REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 2),
           LENGTH(SUBSTRING_INDEX(prog_id, '.', 2 -1)) + 1),
           '.', '') AS id2,
           REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 3),
           LENGTH(SUBSTRING_INDEX(prog_id, '.', 3 -1)) + 1),
           '.', '') AS id3
    FROM programs
    ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))
    

    The best method would be to create the the extra fields like yoda2k says, but if you don't have that access then you could use the above.

    You could encapsulate that into a function like:

    CREATE FUNCTION SPLIT_STR(
      x VARCHAR(255),
      delim VARCHAR(12),
      pos INT
    )
    RETURNS VARCHAR(255)
    RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
           LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
           delim, '');
    

    Then do:

    SELECT SPLIT_STR(prog_id, '.', 1) AS id1,
       SPLIT_STR(prog_id, '.', 2) AS id2,
       SPLIT_STR(prog_id, '.', 3) AS id3,
    FROM programs
    ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))
    
    0 讨论(0)
  • 2021-01-14 06:10

    Not optimal solution -

    ...ORDER BY substring_index(prog_id, '.', 1), substring_index(substring_index(prog_id, '.', 2), '.', -1), substring_index(prog_id, '.', -1)
    

    Odd solution, but try it -

    ...ORDER BY INET_ATON(prog_id)
    
    0 讨论(0)
提交回复
热议问题