MySQL 'Order By' - sorting alphanumeric correctly












48














I want to sort the following data items in the order they are presented below (numbers 1-12):




1
2
3
4
5
6
7
8
9
10
11
12


However, my query - using order by xxxxx asc sorts by the first digit above all else:




1
10
11
12
2
3
4
5
6
7
8
9


Any tricks to make it sort more properly?



Further, in the interest of full disclosure, this could be a mix of letters and numbers (although right now it is not), e.g.:




A1
534G
G46A
100B
100A
100JE


etc....



Thanks!



update: people asking for query



select * from table order by name asc









share|improve this question





























    48














    I want to sort the following data items in the order they are presented below (numbers 1-12):




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12


    However, my query - using order by xxxxx asc sorts by the first digit above all else:




    1
    10
    11
    12
    2
    3
    4
    5
    6
    7
    8
    9


    Any tricks to make it sort more properly?



    Further, in the interest of full disclosure, this could be a mix of letters and numbers (although right now it is not), e.g.:




    A1
    534G
    G46A
    100B
    100A
    100JE


    etc....



    Thanks!



    update: people asking for query



    select * from table order by name asc









    share|improve this question



























      48












      48








      48


      31





      I want to sort the following data items in the order they are presented below (numbers 1-12):




      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12


      However, my query - using order by xxxxx asc sorts by the first digit above all else:




      1
      10
      11
      12
      2
      3
      4
      5
      6
      7
      8
      9


      Any tricks to make it sort more properly?



      Further, in the interest of full disclosure, this could be a mix of letters and numbers (although right now it is not), e.g.:




      A1
      534G
      G46A
      100B
      100A
      100JE


      etc....



      Thanks!



      update: people asking for query



      select * from table order by name asc









      share|improve this question















      I want to sort the following data items in the order they are presented below (numbers 1-12):




      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12


      However, my query - using order by xxxxx asc sorts by the first digit above all else:




      1
      10
      11
      12
      2
      3
      4
      5
      6
      7
      8
      9


      Any tricks to make it sort more properly?



      Further, in the interest of full disclosure, this could be a mix of letters and numbers (although right now it is not), e.g.:




      A1
      534G
      G46A
      100B
      100A
      100JE


      etc....



      Thanks!



      update: people asking for query



      select * from table order by name asc






      mysql sql-order-by






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 12 '18 at 23:41









      Joshua Pinter

      23.9k8137163




      23.9k8137163










      asked Dec 19 '11 at 4:42









      Shackrock

      2,10893766




      2,10893766
























          11 Answers
          11






          active

          oldest

          votes


















          79














          People use different tricks to do this. I Googled and find out some results each follow different tricks. Have a look at them:




          • Alpha Numeric Sorting in MySQL

          • Natural Sorting in MySQL

          • Sorting of numeric values mixed with alphanumeric values

          • mySQL natural sort

          • Natural Sort in MySQL


          Edit:



          I have just added the code of each link for future visitors.



          Alpha Numeric Sorting in MySQL



          Given input




          1A 1a 10A 9B 21C 1C 1D


          Expected output


          1A 1C 1D 1a 9B 10A 21C


          Query



          Bin Way
          ===================================
          SELECT
          tbl_column,
          BIN(tbl_column) AS binray_not_needed_column
          FROM db_table
          ORDER BY binray_not_needed_column ASC , tbl_column ASC

          -----------------------

          Cast Way
          ===================================
          SELECT
          tbl_column,
          CAST(tbl_column as SIGNED) AS casted_column
          FROM db_table
          ORDER BY casted_column ASC , tbl_column ASC


          Natural Sorting in MySQL



          Given input



          Table: sorting_test
          -------------------------- -------------
          | alphanumeric VARCHAR(75) | integer INT |
          -------------------------- -------------
          | test1 | 1 |
          | test12 | 2 |
          | test13 | 3 |
          | test2 | 4 |
          | test3 | 5 |
          -------------------------- -------------


          Expected Output



           -------------------------- -------------
          | alphanumeric VARCHAR(75) | integer INT |
          -------------------------- -------------
          | test1 | 1 |
          | test2 | 4 |
          | test3 | 5 |
          | test12 | 2 |
          | test13 | 3 |
          -------------------------- -------------


          Query



          SELECT alphanumeric, integer
          FROM sorting_test
          ORDER BY LENGTH(alphanumeric), alphanumeric


          Sorting of numeric values mixed with alphanumeric values



          Given input



          2a, 12, 5b, 5a, 10, 11, 1, 4b


          Expected Output



          1, 2a, 4b, 5a, 5b, 10, 11, 12


          Query



          SELECT version
          FROM version_sorting
          ORDER BY CAST(version AS UNSIGNED), version;


          Hope this helps






          share|improve this answer



















          • 12




            It would be great to include more complete information in this post itself.
            – showdev
            Sep 21 '15 at 16:46






          • 2




            @showdev I have included it,hope it might be helpful :)
            – affaz
            Feb 12 '17 at 4:44










          • None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
            – err
            Aug 29 '17 at 20:58





















          12














          I know this post is closed but I think my way could help some people. So there it is :



          My dataset is very similar but is a bit more complex. It has numbers, alphanumeric data :



          1
          2
          Chair
          3
          0
          4
          5
          -
          Table
          10
          13
          19
          Windows
          99
          102
          Dog


          I would like to have the '-' symbol at first, then the numbers, then the text.



          So I go like this :



          SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
          FROM table
          ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name


          The result should be something :



          -
          0
          1
          2
          3
          4
          5
          10
          13
          99
          102
          Chair
          Dog
          Table
          Windows


          The whole idea is doing some simple check into the SELECT and sorting with the result.






          share|improve this answer





















          • I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
            – Yep_It's_Me
            Jan 9 '17 at 6:51



















          10














          Just do this:



          SELECT * FROM table ORDER BY column `name`+0 ASC


          Appending the +0 will mean that:



          0,
          10,
          11,
          2,
          3,
          4



          becomes :



          0,
          2,
          3,
          4,
          10,
          11






          share|improve this answer





















          • This will only work for numeric in a char column.
            – dbinott
            Jun 24 '16 at 14:42






          • 1




            THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
            – Tarik
            Aug 25 '16 at 15:46






          • 2




            @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
            – Andrew Odendaal
            Sep 6 '16 at 9:53










          • doesn't work for char values starting with numbers.
            – Blouarf
            Oct 13 '17 at 20:53



















          7














          I hate this, but this will work



          order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
          <-- you can adjust to a bigger length if you want to





          share|improve this answer





















          • This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
            – dbinott
            Jun 24 '16 at 14:43



















          4














          I had some good results with



          SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC





          share|improve this answer





























            1














            This type of question has been asked previously.



            The type of sorting you are talking about is called "Natural Sorting".
            The data on which you want to do sort is alphanumeric.
            It would be better to create a new column for sorting.



            For further help check
            natural-sort-in-mysql






            share|improve this answer































              0














              This should sort alphanumeric field like:
              1/ Number only, order by 1,2,3,4,5,6,7,8,9,10,11 etc...
              2/ Then field with text like: 1foo, 2bar, aaa11aa, aaa22aa, b5452 etc...



              SELECT  MyField
              FROM MyTable
              order by
              IF( MyField REGEXP '^-?[0-9]+$' = 0,
              9999999999 ,
              CAST(MyField AS DECIMAL)
              ), MyField


              The query check if the data is a number, if not put it to 9999999999 , then order first on this column, then order on data with text



              Good luck!






              share|improve this answer































                0














                SELECT
                s.id, s.name, LENGTH(s.name) len, ASCII(s.name) ASCCCI
                FROM table_name s
                ORDER BY ASCCCI,len,NAME ASC;






                share|improve this answer































                  0














                  Instead of trying to write some function and slow down the SELECT query, I thought of another way of doing this...



                  Create an extra field in your database that holds the result from the following Class and when you insert a new row, run the field value that will be naturally sorted through this class and save its result in the extra field. Then instead of sorting by your original field, sort by the extra field.



                  String nsFieldVal = new NaturalSortString(getFieldValue(), 4).toString()



                  The above means:
                  - Create a NaturalSortString for the String returned from getFieldValue()
                  - Allow up to 4 bytes to store each character or number (4 bytes = ffff = 65535)

                  | field(32) | nsfield(161) |
                  a1 300610001




                  String sortString = new NaturalSortString(getString(), 4).toString()



                  import StringUtils;

                  /**
                  * Creates a string that allows natural sorting in a SQL database
                  * eg, 0 1 1a 2 3 3a 10 100 a a1 a1a1 b
                  */
                  public class NaturalSortString {

                  private String inStr;
                  private int byteSize;
                  private StringBuilder out = new StringBuilder();

                  /**
                  * A byte stores the hex value (0 to f) of a letter or number.
                  * Since a letter is two bytes, the minimum byteSize is 2.
                  *
                  * 2 bytes = 00 - ff (max number is 255)
                  * 3 bytes = 000 - fff (max number is 4095)
                  * 4 bytes = 0000 - ffff (max number is 65535)
                  *
                  * For example:
                  * dog123 = 64,6F,67,7B and thus byteSize >= 2.
                  * dog280 = 64,6F,67,118 and thus byteSize >= 3.
                  *
                  * For example:
                  * The String, "There are 1000000 spots on a dalmatian" would require a byteSize that can
                  * store the number '1000000' which in hex is 'f4240' and thus the byteSize must be at least 5
                  *
                  * The dbColumn size to store the NaturalSortString is calculated as:
                  * > originalStringColumnSize x byteSize + 1
                  * The extra '1' is a marker for String type - Letter, Number, Symbol
                  * Thus, if the originalStringColumn is varchar(32) and the byteSize is 5:
                  * > NaturalSortStringColumnSize = 32 x 5 + 1 = varchar(161)
                  *
                  * The byteSize must be the same for all NaturalSortStrings created in the same table.
                  * If you need to change the byteSize (for instance, to accommodate larger numbers), you will
                  * need to recalculate the NaturalSortString for each existing row using the new byteSize.
                  *
                  * @param str String to create a natural sort string from
                  * @param byteSize Per character storage byte size (minimum 2)
                  * @throws Exception See the error description thrown
                  */
                  public NaturalSortString(String str, int byteSize) throws Exception {
                  if (str == null || str.isEmpty()) return;
                  this.inStr = str;
                  this.byteSize = Math.max(2, byteSize); // minimum of 2 bytes to hold a character
                  setStringType();
                  iterateString();
                  }

                  private void setStringType() {
                  char firstchar = inStr.toLowerCase().subSequence(0, 1).charAt(0);
                  if (Character.isLetter(firstchar)) // letters third
                  out.append(3);
                  else if (Character.isDigit(firstchar)) // numbers second
                  out.append(2);
                  else // non-alphanumeric first
                  out.append(1);
                  }

                  private void iterateString() throws Exception {
                  StringBuilder n = new StringBuilder();
                  for (char c : inStr.toLowerCase().toCharArray()) { // lowercase for CASE INSENSITIVE sorting
                  if (Character.isDigit(c)) {
                  // group numbers
                  n.append(c);
                  continue;
                  }
                  if (n.length() > 0) {
                  addInteger(n.toString());
                  n = new StringBuilder();
                  }
                  addCharacter(c);
                  }
                  if (n.length() > 0) {
                  addInteger(n.toString());
                  }
                  }

                  private void addInteger(String s) throws Exception {
                  int i = Integer.parseInt(s);
                  if (i >= (Math.pow(16, byteSize)))
                  throw new Exception("naturalsort_bytesize_exceeded");
                  out.append(StringUtils.padLeft(Integer.toHexString(i), byteSize));
                  }

                  private void addCharacter(char c) {
                  //TODO: Add rest of accented characters
                  if (c >= 224 && c <= 229) // set accented a to a
                  c = 'a';
                  else if (c >= 232 && c <= 235) // set accented e to e
                  c = 'e';
                  else if (c >= 236 && c <= 239) // set accented i to i
                  c = 'i';
                  else if (c >= 242 && c <= 246) // set accented o to o
                  c = 'o';
                  else if (c >= 249 && c <= 252) // set accented u to u
                  c = 'u';
                  else if (c >= 253 && c <= 255) // set accented y to y
                  c = 'y';

                  out.append(StringUtils.padLeft(Integer.toHexString(c), byteSize));
                  }

                  @Override
                  public String toString() {
                  return out.toString();
                  }
                  }


                  For completeness, below is the StringUtils.padLeft method:



                  public static String padLeft(String s, int n) {
                  if (n - s.length() == 0) return s;
                  return String.format("%0" + (n - s.length()) + "d%s", 0, s);
                  }


                  The result should come out like the following



                  -1
                  -a
                  0
                  1
                  1.0
                  1.01
                  1.1.1
                  1a
                  1b
                  9
                  10
                  10a
                  10ab
                  11
                  12
                  12abcd
                  100
                  a
                  a1a1
                  a1a2
                  a-1
                  a-2
                  áviacion
                  b
                  c1
                  c2
                  c12
                  c100
                  d
                  d1.1.1
                  e





                  share|improve this answer































                    0














                    If you need to sort an alpha-numeric column that does not have any standard format whatsoever



                    SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC


                    You can adapt this solutation to include support for non-alphanumeric characters if desired using additional logic.






                    share|improve this answer





























                      0














                      This works for type of data:
                      Data1,
                      Data2, Data3 ......,Data21. Means "Data" String is common in all rows.



                      For ORDER BY ASC it will sort perfectly, For ORDER BY DESC not suitable.



                      SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;





                      share|improve this answer





















                        Your Answer






                        StackExchange.ifUsing("editor", function () {
                        StackExchange.using("externalEditor", function () {
                        StackExchange.using("snippets", function () {
                        StackExchange.snippets.init();
                        });
                        });
                        }, "code-snippets");

                        StackExchange.ready(function() {
                        var channelOptions = {
                        tags: "".split(" "),
                        id: "1"
                        };
                        initTagRenderer("".split(" "), "".split(" "), channelOptions);

                        StackExchange.using("externalEditor", function() {
                        // Have to fire editor after snippets, if snippets enabled
                        if (StackExchange.settings.snippets.snippetsEnabled) {
                        StackExchange.using("snippets", function() {
                        createEditor();
                        });
                        }
                        else {
                        createEditor();
                        }
                        });

                        function createEditor() {
                        StackExchange.prepareEditor({
                        heartbeatType: 'answer',
                        autoActivateHeartbeat: false,
                        convertImagesToLinks: true,
                        noModals: true,
                        showLowRepImageUploadWarning: true,
                        reputationToPostImages: 10,
                        bindNavPrevention: true,
                        postfix: "",
                        imageUploader: {
                        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                        allowUrls: true
                        },
                        onDemand: true,
                        discardSelector: ".discard-answer"
                        ,immediatelyShowMarkdownHelp:true
                        });


                        }
                        });














                        draft saved

                        draft discarded


















                        StackExchange.ready(
                        function () {
                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f8557172%2fmysql-order-by-sorting-alphanumeric-correctly%23new-answer', 'question_page');
                        }
                        );

                        Post as a guest















                        Required, but never shown

























                        11 Answers
                        11






                        active

                        oldest

                        votes








                        11 Answers
                        11






                        active

                        oldest

                        votes









                        active

                        oldest

                        votes






                        active

                        oldest

                        votes









                        79














                        People use different tricks to do this. I Googled and find out some results each follow different tricks. Have a look at them:




                        • Alpha Numeric Sorting in MySQL

                        • Natural Sorting in MySQL

                        • Sorting of numeric values mixed with alphanumeric values

                        • mySQL natural sort

                        • Natural Sort in MySQL


                        Edit:



                        I have just added the code of each link for future visitors.



                        Alpha Numeric Sorting in MySQL



                        Given input




                        1A 1a 10A 9B 21C 1C 1D


                        Expected output


                        1A 1C 1D 1a 9B 10A 21C


                        Query



                        Bin Way
                        ===================================
                        SELECT
                        tbl_column,
                        BIN(tbl_column) AS binray_not_needed_column
                        FROM db_table
                        ORDER BY binray_not_needed_column ASC , tbl_column ASC

                        -----------------------

                        Cast Way
                        ===================================
                        SELECT
                        tbl_column,
                        CAST(tbl_column as SIGNED) AS casted_column
                        FROM db_table
                        ORDER BY casted_column ASC , tbl_column ASC


                        Natural Sorting in MySQL



                        Given input



                        Table: sorting_test
                        -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test12 | 2 |
                        | test13 | 3 |
                        | test2 | 4 |
                        | test3 | 5 |
                        -------------------------- -------------


                        Expected Output



                         -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test2 | 4 |
                        | test3 | 5 |
                        | test12 | 2 |
                        | test13 | 3 |
                        -------------------------- -------------


                        Query



                        SELECT alphanumeric, integer
                        FROM sorting_test
                        ORDER BY LENGTH(alphanumeric), alphanumeric


                        Sorting of numeric values mixed with alphanumeric values



                        Given input



                        2a, 12, 5b, 5a, 10, 11, 1, 4b


                        Expected Output



                        1, 2a, 4b, 5a, 5b, 10, 11, 12


                        Query



                        SELECT version
                        FROM version_sorting
                        ORDER BY CAST(version AS UNSIGNED), version;


                        Hope this helps






                        share|improve this answer



















                        • 12




                          It would be great to include more complete information in this post itself.
                          – showdev
                          Sep 21 '15 at 16:46






                        • 2




                          @showdev I have included it,hope it might be helpful :)
                          – affaz
                          Feb 12 '17 at 4:44










                        • None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                          – err
                          Aug 29 '17 at 20:58


















                        79














                        People use different tricks to do this. I Googled and find out some results each follow different tricks. Have a look at them:




                        • Alpha Numeric Sorting in MySQL

                        • Natural Sorting in MySQL

                        • Sorting of numeric values mixed with alphanumeric values

                        • mySQL natural sort

                        • Natural Sort in MySQL


                        Edit:



                        I have just added the code of each link for future visitors.



                        Alpha Numeric Sorting in MySQL



                        Given input




                        1A 1a 10A 9B 21C 1C 1D


                        Expected output


                        1A 1C 1D 1a 9B 10A 21C


                        Query



                        Bin Way
                        ===================================
                        SELECT
                        tbl_column,
                        BIN(tbl_column) AS binray_not_needed_column
                        FROM db_table
                        ORDER BY binray_not_needed_column ASC , tbl_column ASC

                        -----------------------

                        Cast Way
                        ===================================
                        SELECT
                        tbl_column,
                        CAST(tbl_column as SIGNED) AS casted_column
                        FROM db_table
                        ORDER BY casted_column ASC , tbl_column ASC


                        Natural Sorting in MySQL



                        Given input



                        Table: sorting_test
                        -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test12 | 2 |
                        | test13 | 3 |
                        | test2 | 4 |
                        | test3 | 5 |
                        -------------------------- -------------


                        Expected Output



                         -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test2 | 4 |
                        | test3 | 5 |
                        | test12 | 2 |
                        | test13 | 3 |
                        -------------------------- -------------


                        Query



                        SELECT alphanumeric, integer
                        FROM sorting_test
                        ORDER BY LENGTH(alphanumeric), alphanumeric


                        Sorting of numeric values mixed with alphanumeric values



                        Given input



                        2a, 12, 5b, 5a, 10, 11, 1, 4b


                        Expected Output



                        1, 2a, 4b, 5a, 5b, 10, 11, 12


                        Query



                        SELECT version
                        FROM version_sorting
                        ORDER BY CAST(version AS UNSIGNED), version;


                        Hope this helps






                        share|improve this answer



















                        • 12




                          It would be great to include more complete information in this post itself.
                          – showdev
                          Sep 21 '15 at 16:46






                        • 2




                          @showdev I have included it,hope it might be helpful :)
                          – affaz
                          Feb 12 '17 at 4:44










                        • None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                          – err
                          Aug 29 '17 at 20:58
















                        79












                        79








                        79






                        People use different tricks to do this. I Googled and find out some results each follow different tricks. Have a look at them:




                        • Alpha Numeric Sorting in MySQL

                        • Natural Sorting in MySQL

                        • Sorting of numeric values mixed with alphanumeric values

                        • mySQL natural sort

                        • Natural Sort in MySQL


                        Edit:



                        I have just added the code of each link for future visitors.



                        Alpha Numeric Sorting in MySQL



                        Given input




                        1A 1a 10A 9B 21C 1C 1D


                        Expected output


                        1A 1C 1D 1a 9B 10A 21C


                        Query



                        Bin Way
                        ===================================
                        SELECT
                        tbl_column,
                        BIN(tbl_column) AS binray_not_needed_column
                        FROM db_table
                        ORDER BY binray_not_needed_column ASC , tbl_column ASC

                        -----------------------

                        Cast Way
                        ===================================
                        SELECT
                        tbl_column,
                        CAST(tbl_column as SIGNED) AS casted_column
                        FROM db_table
                        ORDER BY casted_column ASC , tbl_column ASC


                        Natural Sorting in MySQL



                        Given input



                        Table: sorting_test
                        -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test12 | 2 |
                        | test13 | 3 |
                        | test2 | 4 |
                        | test3 | 5 |
                        -------------------------- -------------


                        Expected Output



                         -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test2 | 4 |
                        | test3 | 5 |
                        | test12 | 2 |
                        | test13 | 3 |
                        -------------------------- -------------


                        Query



                        SELECT alphanumeric, integer
                        FROM sorting_test
                        ORDER BY LENGTH(alphanumeric), alphanumeric


                        Sorting of numeric values mixed with alphanumeric values



                        Given input



                        2a, 12, 5b, 5a, 10, 11, 1, 4b


                        Expected Output



                        1, 2a, 4b, 5a, 5b, 10, 11, 12


                        Query



                        SELECT version
                        FROM version_sorting
                        ORDER BY CAST(version AS UNSIGNED), version;


                        Hope this helps






                        share|improve this answer














                        People use different tricks to do this. I Googled and find out some results each follow different tricks. Have a look at them:




                        • Alpha Numeric Sorting in MySQL

                        • Natural Sorting in MySQL

                        • Sorting of numeric values mixed with alphanumeric values

                        • mySQL natural sort

                        • Natural Sort in MySQL


                        Edit:



                        I have just added the code of each link for future visitors.



                        Alpha Numeric Sorting in MySQL



                        Given input




                        1A 1a 10A 9B 21C 1C 1D


                        Expected output


                        1A 1C 1D 1a 9B 10A 21C


                        Query



                        Bin Way
                        ===================================
                        SELECT
                        tbl_column,
                        BIN(tbl_column) AS binray_not_needed_column
                        FROM db_table
                        ORDER BY binray_not_needed_column ASC , tbl_column ASC

                        -----------------------

                        Cast Way
                        ===================================
                        SELECT
                        tbl_column,
                        CAST(tbl_column as SIGNED) AS casted_column
                        FROM db_table
                        ORDER BY casted_column ASC , tbl_column ASC


                        Natural Sorting in MySQL



                        Given input



                        Table: sorting_test
                        -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test12 | 2 |
                        | test13 | 3 |
                        | test2 | 4 |
                        | test3 | 5 |
                        -------------------------- -------------


                        Expected Output



                         -------------------------- -------------
                        | alphanumeric VARCHAR(75) | integer INT |
                        -------------------------- -------------
                        | test1 | 1 |
                        | test2 | 4 |
                        | test3 | 5 |
                        | test12 | 2 |
                        | test13 | 3 |
                        -------------------------- -------------


                        Query



                        SELECT alphanumeric, integer
                        FROM sorting_test
                        ORDER BY LENGTH(alphanumeric), alphanumeric


                        Sorting of numeric values mixed with alphanumeric values



                        Given input



                        2a, 12, 5b, 5a, 10, 11, 1, 4b


                        Expected Output



                        1, 2a, 4b, 5a, 5b, 10, 11, 12


                        Query



                        SELECT version
                        FROM version_sorting
                        ORDER BY CAST(version AS UNSIGNED), version;


                        Hope this helps







                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited May 23 '17 at 10:31









                        Community

                        11




                        11










                        answered Dec 19 '11 at 5:03









                        Jomoos

                        8,15364277




                        8,15364277








                        • 12




                          It would be great to include more complete information in this post itself.
                          – showdev
                          Sep 21 '15 at 16:46






                        • 2




                          @showdev I have included it,hope it might be helpful :)
                          – affaz
                          Feb 12 '17 at 4:44










                        • None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                          – err
                          Aug 29 '17 at 20:58
















                        • 12




                          It would be great to include more complete information in this post itself.
                          – showdev
                          Sep 21 '15 at 16:46






                        • 2




                          @showdev I have included it,hope it might be helpful :)
                          – affaz
                          Feb 12 '17 at 4:44










                        • None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                          – err
                          Aug 29 '17 at 20:58










                        12




                        12




                        It would be great to include more complete information in this post itself.
                        – showdev
                        Sep 21 '15 at 16:46




                        It would be great to include more complete information in this post itself.
                        – showdev
                        Sep 21 '15 at 16:46




                        2




                        2




                        @showdev I have included it,hope it might be helpful :)
                        – affaz
                        Feb 12 '17 at 4:44




                        @showdev I have included it,hope it might be helpful :)
                        – affaz
                        Feb 12 '17 at 4:44












                        None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                        – err
                        Aug 29 '17 at 20:58






                        None of these worked for me :/ Any recommendations for a list like this? pastebin.com/d4kXq6HS Ideal output is: pastebin.com/kJ4Zc3XY
                        – err
                        Aug 29 '17 at 20:58















                        12














                        I know this post is closed but I think my way could help some people. So there it is :



                        My dataset is very similar but is a bit more complex. It has numbers, alphanumeric data :



                        1
                        2
                        Chair
                        3
                        0
                        4
                        5
                        -
                        Table
                        10
                        13
                        19
                        Windows
                        99
                        102
                        Dog


                        I would like to have the '-' symbol at first, then the numbers, then the text.



                        So I go like this :



                        SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
                        FROM table
                        ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name


                        The result should be something :



                        -
                        0
                        1
                        2
                        3
                        4
                        5
                        10
                        13
                        99
                        102
                        Chair
                        Dog
                        Table
                        Windows


                        The whole idea is doing some simple check into the SELECT and sorting with the result.






                        share|improve this answer





















                        • I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                          – Yep_It's_Me
                          Jan 9 '17 at 6:51
















                        12














                        I know this post is closed but I think my way could help some people. So there it is :



                        My dataset is very similar but is a bit more complex. It has numbers, alphanumeric data :



                        1
                        2
                        Chair
                        3
                        0
                        4
                        5
                        -
                        Table
                        10
                        13
                        19
                        Windows
                        99
                        102
                        Dog


                        I would like to have the '-' symbol at first, then the numbers, then the text.



                        So I go like this :



                        SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
                        FROM table
                        ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name


                        The result should be something :



                        -
                        0
                        1
                        2
                        3
                        4
                        5
                        10
                        13
                        99
                        102
                        Chair
                        Dog
                        Table
                        Windows


                        The whole idea is doing some simple check into the SELECT and sorting with the result.






                        share|improve this answer





















                        • I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                          – Yep_It's_Me
                          Jan 9 '17 at 6:51














                        12












                        12








                        12






                        I know this post is closed but I think my way could help some people. So there it is :



                        My dataset is very similar but is a bit more complex. It has numbers, alphanumeric data :



                        1
                        2
                        Chair
                        3
                        0
                        4
                        5
                        -
                        Table
                        10
                        13
                        19
                        Windows
                        99
                        102
                        Dog


                        I would like to have the '-' symbol at first, then the numbers, then the text.



                        So I go like this :



                        SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
                        FROM table
                        ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name


                        The result should be something :



                        -
                        0
                        1
                        2
                        3
                        4
                        5
                        10
                        13
                        99
                        102
                        Chair
                        Dog
                        Table
                        Windows


                        The whole idea is doing some simple check into the SELECT and sorting with the result.






                        share|improve this answer












                        I know this post is closed but I think my way could help some people. So there it is :



                        My dataset is very similar but is a bit more complex. It has numbers, alphanumeric data :



                        1
                        2
                        Chair
                        3
                        0
                        4
                        5
                        -
                        Table
                        10
                        13
                        19
                        Windows
                        99
                        102
                        Dog


                        I would like to have the '-' symbol at first, then the numbers, then the text.



                        So I go like this :



                        SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
                        FROM table
                        ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name


                        The result should be something :



                        -
                        0
                        1
                        2
                        3
                        4
                        5
                        10
                        13
                        99
                        102
                        Chair
                        Dog
                        Table
                        Windows


                        The whole idea is doing some simple check into the SELECT and sorting with the result.







                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Oct 16 '13 at 20:47









                        antoine

                        18614




                        18614












                        • I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                          – Yep_It's_Me
                          Jan 9 '17 at 6:51


















                        • I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                          – Yep_It's_Me
                          Jan 9 '17 at 6:51
















                        I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                        – Yep_It's_Me
                        Jan 9 '17 at 6:51




                        I couldn't get this to work by putting (name = '-') boolDash in the select statement. But I got it working by putting name = '-' directly in the order by statement.
                        – Yep_It's_Me
                        Jan 9 '17 at 6:51











                        10














                        Just do this:



                        SELECT * FROM table ORDER BY column `name`+0 ASC


                        Appending the +0 will mean that:



                        0,
                        10,
                        11,
                        2,
                        3,
                        4



                        becomes :



                        0,
                        2,
                        3,
                        4,
                        10,
                        11






                        share|improve this answer





















                        • This will only work for numeric in a char column.
                          – dbinott
                          Jun 24 '16 at 14:42






                        • 1




                          THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                          – Tarik
                          Aug 25 '16 at 15:46






                        • 2




                          @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                          – Andrew Odendaal
                          Sep 6 '16 at 9:53










                        • doesn't work for char values starting with numbers.
                          – Blouarf
                          Oct 13 '17 at 20:53
















                        10














                        Just do this:



                        SELECT * FROM table ORDER BY column `name`+0 ASC


                        Appending the +0 will mean that:



                        0,
                        10,
                        11,
                        2,
                        3,
                        4



                        becomes :



                        0,
                        2,
                        3,
                        4,
                        10,
                        11






                        share|improve this answer





















                        • This will only work for numeric in a char column.
                          – dbinott
                          Jun 24 '16 at 14:42






                        • 1




                          THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                          – Tarik
                          Aug 25 '16 at 15:46






                        • 2




                          @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                          – Andrew Odendaal
                          Sep 6 '16 at 9:53










                        • doesn't work for char values starting with numbers.
                          – Blouarf
                          Oct 13 '17 at 20:53














                        10












                        10








                        10






                        Just do this:



                        SELECT * FROM table ORDER BY column `name`+0 ASC


                        Appending the +0 will mean that:



                        0,
                        10,
                        11,
                        2,
                        3,
                        4



                        becomes :



                        0,
                        2,
                        3,
                        4,
                        10,
                        11






                        share|improve this answer












                        Just do this:



                        SELECT * FROM table ORDER BY column `name`+0 ASC


                        Appending the +0 will mean that:



                        0,
                        10,
                        11,
                        2,
                        3,
                        4



                        becomes :



                        0,
                        2,
                        3,
                        4,
                        10,
                        11







                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Mar 3 '16 at 18:58









                        Andrew Odendaal

                        1,4061621




                        1,4061621












                        • This will only work for numeric in a char column.
                          – dbinott
                          Jun 24 '16 at 14:42






                        • 1




                          THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                          – Tarik
                          Aug 25 '16 at 15:46






                        • 2




                          @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                          – Andrew Odendaal
                          Sep 6 '16 at 9:53










                        • doesn't work for char values starting with numbers.
                          – Blouarf
                          Oct 13 '17 at 20:53


















                        • This will only work for numeric in a char column.
                          – dbinott
                          Jun 24 '16 at 14:42






                        • 1




                          THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                          – Tarik
                          Aug 25 '16 at 15:46






                        • 2




                          @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                          – Andrew Odendaal
                          Sep 6 '16 at 9:53










                        • doesn't work for char values starting with numbers.
                          – Blouarf
                          Oct 13 '17 at 20:53
















                        This will only work for numeric in a char column.
                        – dbinott
                        Jun 24 '16 at 14:42




                        This will only work for numeric in a char column.
                        – dbinott
                        Jun 24 '16 at 14:42




                        1




                        1




                        THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                        – Tarik
                        Aug 25 '16 at 15:46




                        THIS IS VERY DANGEROUS! On my query it worked fine, I upvoted the answer BUT when I refreshed, it didn't work! Then I go ahead and refresh the query 100 times, randomly it works and doesn't work for the SAME query! Don't rely on this! My table has a number at the end and here is my query: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1
                        – Tarik
                        Aug 25 '16 at 15:46




                        2




                        2




                        @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                        – Andrew Odendaal
                        Sep 6 '16 at 9:53




                        @Tarik It's probably because you are using information_schema which are just estimated values, they are not fully aggregated.
                        – Andrew Odendaal
                        Sep 6 '16 at 9:53












                        doesn't work for char values starting with numbers.
                        – Blouarf
                        Oct 13 '17 at 20:53




                        doesn't work for char values starting with numbers.
                        – Blouarf
                        Oct 13 '17 at 20:53











                        7














                        I hate this, but this will work



                        order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
                        <-- you can adjust to a bigger length if you want to





                        share|improve this answer





















                        • This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                          – dbinott
                          Jun 24 '16 at 14:43
















                        7














                        I hate this, but this will work



                        order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
                        <-- you can adjust to a bigger length if you want to





                        share|improve this answer





















                        • This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                          – dbinott
                          Jun 24 '16 at 14:43














                        7












                        7








                        7






                        I hate this, but this will work



                        order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
                        <-- you can adjust to a bigger length if you want to





                        share|improve this answer












                        I hate this, but this will work



                        order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
                        <-- you can adjust to a bigger length if you want to






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Dec 19 '11 at 5:00









                        ajreal

                        41.1k1072112




                        41.1k1072112












                        • This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                          – dbinott
                          Jun 24 '16 at 14:43


















                        • This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                          – dbinott
                          Jun 24 '16 at 14:43
















                        This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                        – dbinott
                        Jun 24 '16 at 14:43




                        This actually works for my scenario of USA-0027-1,USA-0027-2,USA-0027-10,USA-0027-12
                        – dbinott
                        Jun 24 '16 at 14:43











                        4














                        I had some good results with



                        SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC





                        share|improve this answer


























                          4














                          I had some good results with



                          SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC





                          share|improve this answer
























                            4












                            4








                            4






                            I had some good results with



                            SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC





                            share|improve this answer












                            I had some good results with



                            SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Aug 11 '16 at 6:17









                            Blouarf

                            242316




                            242316























                                1














                                This type of question has been asked previously.



                                The type of sorting you are talking about is called "Natural Sorting".
                                The data on which you want to do sort is alphanumeric.
                                It would be better to create a new column for sorting.



                                For further help check
                                natural-sort-in-mysql






                                share|improve this answer




























                                  1














                                  This type of question has been asked previously.



                                  The type of sorting you are talking about is called "Natural Sorting".
                                  The data on which you want to do sort is alphanumeric.
                                  It would be better to create a new column for sorting.



                                  For further help check
                                  natural-sort-in-mysql






                                  share|improve this answer


























                                    1












                                    1








                                    1






                                    This type of question has been asked previously.



                                    The type of sorting you are talking about is called "Natural Sorting".
                                    The data on which you want to do sort is alphanumeric.
                                    It would be better to create a new column for sorting.



                                    For further help check
                                    natural-sort-in-mysql






                                    share|improve this answer














                                    This type of question has been asked previously.



                                    The type of sorting you are talking about is called "Natural Sorting".
                                    The data on which you want to do sort is alphanumeric.
                                    It would be better to create a new column for sorting.



                                    For further help check
                                    natural-sort-in-mysql







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited May 23 '17 at 12:02









                                    Community

                                    11




                                    11










                                    answered Dec 19 '11 at 4:53









                                    nishantagarwal

                                    14613




                                    14613























                                        0














                                        This should sort alphanumeric field like:
                                        1/ Number only, order by 1,2,3,4,5,6,7,8,9,10,11 etc...
                                        2/ Then field with text like: 1foo, 2bar, aaa11aa, aaa22aa, b5452 etc...



                                        SELECT  MyField
                                        FROM MyTable
                                        order by
                                        IF( MyField REGEXP '^-?[0-9]+$' = 0,
                                        9999999999 ,
                                        CAST(MyField AS DECIMAL)
                                        ), MyField


                                        The query check if the data is a number, if not put it to 9999999999 , then order first on this column, then order on data with text



                                        Good luck!






                                        share|improve this answer




























                                          0














                                          This should sort alphanumeric field like:
                                          1/ Number only, order by 1,2,3,4,5,6,7,8,9,10,11 etc...
                                          2/ Then field with text like: 1foo, 2bar, aaa11aa, aaa22aa, b5452 etc...



                                          SELECT  MyField
                                          FROM MyTable
                                          order by
                                          IF( MyField REGEXP '^-?[0-9]+$' = 0,
                                          9999999999 ,
                                          CAST(MyField AS DECIMAL)
                                          ), MyField


                                          The query check if the data is a number, if not put it to 9999999999 , then order first on this column, then order on data with text



                                          Good luck!






                                          share|improve this answer


























                                            0












                                            0








                                            0






                                            This should sort alphanumeric field like:
                                            1/ Number only, order by 1,2,3,4,5,6,7,8,9,10,11 etc...
                                            2/ Then field with text like: 1foo, 2bar, aaa11aa, aaa22aa, b5452 etc...



                                            SELECT  MyField
                                            FROM MyTable
                                            order by
                                            IF( MyField REGEXP '^-?[0-9]+$' = 0,
                                            9999999999 ,
                                            CAST(MyField AS DECIMAL)
                                            ), MyField


                                            The query check if the data is a number, if not put it to 9999999999 , then order first on this column, then order on data with text



                                            Good luck!






                                            share|improve this answer














                                            This should sort alphanumeric field like:
                                            1/ Number only, order by 1,2,3,4,5,6,7,8,9,10,11 etc...
                                            2/ Then field with text like: 1foo, 2bar, aaa11aa, aaa22aa, b5452 etc...



                                            SELECT  MyField
                                            FROM MyTable
                                            order by
                                            IF( MyField REGEXP '^-?[0-9]+$' = 0,
                                            9999999999 ,
                                            CAST(MyField AS DECIMAL)
                                            ), MyField


                                            The query check if the data is a number, if not put it to 9999999999 , then order first on this column, then order on data with text



                                            Good luck!







                                            share|improve this answer














                                            share|improve this answer



                                            share|improve this answer








                                            edited Jul 5 '17 at 2:09









                                            Dimgold

                                            1,19021133




                                            1,19021133










                                            answered Jul 4 '17 at 19:47









                                            user8255718

                                            1




                                            1























                                                0














                                                SELECT
                                                s.id, s.name, LENGTH(s.name) len, ASCII(s.name) ASCCCI
                                                FROM table_name s
                                                ORDER BY ASCCCI,len,NAME ASC;






                                                share|improve this answer




























                                                  0














                                                  SELECT
                                                  s.id, s.name, LENGTH(s.name) len, ASCII(s.name) ASCCCI
                                                  FROM table_name s
                                                  ORDER BY ASCCCI,len,NAME ASC;






                                                  share|improve this answer


























                                                    0












                                                    0








                                                    0






                                                    SELECT
                                                    s.id, s.name, LENGTH(s.name) len, ASCII(s.name) ASCCCI
                                                    FROM table_name s
                                                    ORDER BY ASCCCI,len,NAME ASC;






                                                    share|improve this answer














                                                    SELECT
                                                    s.id, s.name, LENGTH(s.name) len, ASCII(s.name) ASCCCI
                                                    FROM table_name s
                                                    ORDER BY ASCCCI,len,NAME ASC;







                                                    share|improve this answer














                                                    share|improve this answer



                                                    share|improve this answer








                                                    edited Aug 7 '17 at 7:13

























                                                    answered Jul 16 '17 at 13:43









                                                    Hosain Ahmed

                                                    825




                                                    825























                                                        0














                                                        Instead of trying to write some function and slow down the SELECT query, I thought of another way of doing this...



                                                        Create an extra field in your database that holds the result from the following Class and when you insert a new row, run the field value that will be naturally sorted through this class and save its result in the extra field. Then instead of sorting by your original field, sort by the extra field.



                                                        String nsFieldVal = new NaturalSortString(getFieldValue(), 4).toString()



                                                        The above means:
                                                        - Create a NaturalSortString for the String returned from getFieldValue()
                                                        - Allow up to 4 bytes to store each character or number (4 bytes = ffff = 65535)

                                                        | field(32) | nsfield(161) |
                                                        a1 300610001




                                                        String sortString = new NaturalSortString(getString(), 4).toString()



                                                        import StringUtils;

                                                        /**
                                                        * Creates a string that allows natural sorting in a SQL database
                                                        * eg, 0 1 1a 2 3 3a 10 100 a a1 a1a1 b
                                                        */
                                                        public class NaturalSortString {

                                                        private String inStr;
                                                        private int byteSize;
                                                        private StringBuilder out = new StringBuilder();

                                                        /**
                                                        * A byte stores the hex value (0 to f) of a letter or number.
                                                        * Since a letter is two bytes, the minimum byteSize is 2.
                                                        *
                                                        * 2 bytes = 00 - ff (max number is 255)
                                                        * 3 bytes = 000 - fff (max number is 4095)
                                                        * 4 bytes = 0000 - ffff (max number is 65535)
                                                        *
                                                        * For example:
                                                        * dog123 = 64,6F,67,7B and thus byteSize >= 2.
                                                        * dog280 = 64,6F,67,118 and thus byteSize >= 3.
                                                        *
                                                        * For example:
                                                        * The String, "There are 1000000 spots on a dalmatian" would require a byteSize that can
                                                        * store the number '1000000' which in hex is 'f4240' and thus the byteSize must be at least 5
                                                        *
                                                        * The dbColumn size to store the NaturalSortString is calculated as:
                                                        * > originalStringColumnSize x byteSize + 1
                                                        * The extra '1' is a marker for String type - Letter, Number, Symbol
                                                        * Thus, if the originalStringColumn is varchar(32) and the byteSize is 5:
                                                        * > NaturalSortStringColumnSize = 32 x 5 + 1 = varchar(161)
                                                        *
                                                        * The byteSize must be the same for all NaturalSortStrings created in the same table.
                                                        * If you need to change the byteSize (for instance, to accommodate larger numbers), you will
                                                        * need to recalculate the NaturalSortString for each existing row using the new byteSize.
                                                        *
                                                        * @param str String to create a natural sort string from
                                                        * @param byteSize Per character storage byte size (minimum 2)
                                                        * @throws Exception See the error description thrown
                                                        */
                                                        public NaturalSortString(String str, int byteSize) throws Exception {
                                                        if (str == null || str.isEmpty()) return;
                                                        this.inStr = str;
                                                        this.byteSize = Math.max(2, byteSize); // minimum of 2 bytes to hold a character
                                                        setStringType();
                                                        iterateString();
                                                        }

                                                        private void setStringType() {
                                                        char firstchar = inStr.toLowerCase().subSequence(0, 1).charAt(0);
                                                        if (Character.isLetter(firstchar)) // letters third
                                                        out.append(3);
                                                        else if (Character.isDigit(firstchar)) // numbers second
                                                        out.append(2);
                                                        else // non-alphanumeric first
                                                        out.append(1);
                                                        }

                                                        private void iterateString() throws Exception {
                                                        StringBuilder n = new StringBuilder();
                                                        for (char c : inStr.toLowerCase().toCharArray()) { // lowercase for CASE INSENSITIVE sorting
                                                        if (Character.isDigit(c)) {
                                                        // group numbers
                                                        n.append(c);
                                                        continue;
                                                        }
                                                        if (n.length() > 0) {
                                                        addInteger(n.toString());
                                                        n = new StringBuilder();
                                                        }
                                                        addCharacter(c);
                                                        }
                                                        if (n.length() > 0) {
                                                        addInteger(n.toString());
                                                        }
                                                        }

                                                        private void addInteger(String s) throws Exception {
                                                        int i = Integer.parseInt(s);
                                                        if (i >= (Math.pow(16, byteSize)))
                                                        throw new Exception("naturalsort_bytesize_exceeded");
                                                        out.append(StringUtils.padLeft(Integer.toHexString(i), byteSize));
                                                        }

                                                        private void addCharacter(char c) {
                                                        //TODO: Add rest of accented characters
                                                        if (c >= 224 && c <= 229) // set accented a to a
                                                        c = 'a';
                                                        else if (c >= 232 && c <= 235) // set accented e to e
                                                        c = 'e';
                                                        else if (c >= 236 && c <= 239) // set accented i to i
                                                        c = 'i';
                                                        else if (c >= 242 && c <= 246) // set accented o to o
                                                        c = 'o';
                                                        else if (c >= 249 && c <= 252) // set accented u to u
                                                        c = 'u';
                                                        else if (c >= 253 && c <= 255) // set accented y to y
                                                        c = 'y';

                                                        out.append(StringUtils.padLeft(Integer.toHexString(c), byteSize));
                                                        }

                                                        @Override
                                                        public String toString() {
                                                        return out.toString();
                                                        }
                                                        }


                                                        For completeness, below is the StringUtils.padLeft method:



                                                        public static String padLeft(String s, int n) {
                                                        if (n - s.length() == 0) return s;
                                                        return String.format("%0" + (n - s.length()) + "d%s", 0, s);
                                                        }


                                                        The result should come out like the following



                                                        -1
                                                        -a
                                                        0
                                                        1
                                                        1.0
                                                        1.01
                                                        1.1.1
                                                        1a
                                                        1b
                                                        9
                                                        10
                                                        10a
                                                        10ab
                                                        11
                                                        12
                                                        12abcd
                                                        100
                                                        a
                                                        a1a1
                                                        a1a2
                                                        a-1
                                                        a-2
                                                        áviacion
                                                        b
                                                        c1
                                                        c2
                                                        c12
                                                        c100
                                                        d
                                                        d1.1.1
                                                        e





                                                        share|improve this answer




























                                                          0














                                                          Instead of trying to write some function and slow down the SELECT query, I thought of another way of doing this...



                                                          Create an extra field in your database that holds the result from the following Class and when you insert a new row, run the field value that will be naturally sorted through this class and save its result in the extra field. Then instead of sorting by your original field, sort by the extra field.



                                                          String nsFieldVal = new NaturalSortString(getFieldValue(), 4).toString()



                                                          The above means:
                                                          - Create a NaturalSortString for the String returned from getFieldValue()
                                                          - Allow up to 4 bytes to store each character or number (4 bytes = ffff = 65535)

                                                          | field(32) | nsfield(161) |
                                                          a1 300610001




                                                          String sortString = new NaturalSortString(getString(), 4).toString()



                                                          import StringUtils;

                                                          /**
                                                          * Creates a string that allows natural sorting in a SQL database
                                                          * eg, 0 1 1a 2 3 3a 10 100 a a1 a1a1 b
                                                          */
                                                          public class NaturalSortString {

                                                          private String inStr;
                                                          private int byteSize;
                                                          private StringBuilder out = new StringBuilder();

                                                          /**
                                                          * A byte stores the hex value (0 to f) of a letter or number.
                                                          * Since a letter is two bytes, the minimum byteSize is 2.
                                                          *
                                                          * 2 bytes = 00 - ff (max number is 255)
                                                          * 3 bytes = 000 - fff (max number is 4095)
                                                          * 4 bytes = 0000 - ffff (max number is 65535)
                                                          *
                                                          * For example:
                                                          * dog123 = 64,6F,67,7B and thus byteSize >= 2.
                                                          * dog280 = 64,6F,67,118 and thus byteSize >= 3.
                                                          *
                                                          * For example:
                                                          * The String, "There are 1000000 spots on a dalmatian" would require a byteSize that can
                                                          * store the number '1000000' which in hex is 'f4240' and thus the byteSize must be at least 5
                                                          *
                                                          * The dbColumn size to store the NaturalSortString is calculated as:
                                                          * > originalStringColumnSize x byteSize + 1
                                                          * The extra '1' is a marker for String type - Letter, Number, Symbol
                                                          * Thus, if the originalStringColumn is varchar(32) and the byteSize is 5:
                                                          * > NaturalSortStringColumnSize = 32 x 5 + 1 = varchar(161)
                                                          *
                                                          * The byteSize must be the same for all NaturalSortStrings created in the same table.
                                                          * If you need to change the byteSize (for instance, to accommodate larger numbers), you will
                                                          * need to recalculate the NaturalSortString for each existing row using the new byteSize.
                                                          *
                                                          * @param str String to create a natural sort string from
                                                          * @param byteSize Per character storage byte size (minimum 2)
                                                          * @throws Exception See the error description thrown
                                                          */
                                                          public NaturalSortString(String str, int byteSize) throws Exception {
                                                          if (str == null || str.isEmpty()) return;
                                                          this.inStr = str;
                                                          this.byteSize = Math.max(2, byteSize); // minimum of 2 bytes to hold a character
                                                          setStringType();
                                                          iterateString();
                                                          }

                                                          private void setStringType() {
                                                          char firstchar = inStr.toLowerCase().subSequence(0, 1).charAt(0);
                                                          if (Character.isLetter(firstchar)) // letters third
                                                          out.append(3);
                                                          else if (Character.isDigit(firstchar)) // numbers second
                                                          out.append(2);
                                                          else // non-alphanumeric first
                                                          out.append(1);
                                                          }

                                                          private void iterateString() throws Exception {
                                                          StringBuilder n = new StringBuilder();
                                                          for (char c : inStr.toLowerCase().toCharArray()) { // lowercase for CASE INSENSITIVE sorting
                                                          if (Character.isDigit(c)) {
                                                          // group numbers
                                                          n.append(c);
                                                          continue;
                                                          }
                                                          if (n.length() > 0) {
                                                          addInteger(n.toString());
                                                          n = new StringBuilder();
                                                          }
                                                          addCharacter(c);
                                                          }
                                                          if (n.length() > 0) {
                                                          addInteger(n.toString());
                                                          }
                                                          }

                                                          private void addInteger(String s) throws Exception {
                                                          int i = Integer.parseInt(s);
                                                          if (i >= (Math.pow(16, byteSize)))
                                                          throw new Exception("naturalsort_bytesize_exceeded");
                                                          out.append(StringUtils.padLeft(Integer.toHexString(i), byteSize));
                                                          }

                                                          private void addCharacter(char c) {
                                                          //TODO: Add rest of accented characters
                                                          if (c >= 224 && c <= 229) // set accented a to a
                                                          c = 'a';
                                                          else if (c >= 232 && c <= 235) // set accented e to e
                                                          c = 'e';
                                                          else if (c >= 236 && c <= 239) // set accented i to i
                                                          c = 'i';
                                                          else if (c >= 242 && c <= 246) // set accented o to o
                                                          c = 'o';
                                                          else if (c >= 249 && c <= 252) // set accented u to u
                                                          c = 'u';
                                                          else if (c >= 253 && c <= 255) // set accented y to y
                                                          c = 'y';

                                                          out.append(StringUtils.padLeft(Integer.toHexString(c), byteSize));
                                                          }

                                                          @Override
                                                          public String toString() {
                                                          return out.toString();
                                                          }
                                                          }


                                                          For completeness, below is the StringUtils.padLeft method:



                                                          public static String padLeft(String s, int n) {
                                                          if (n - s.length() == 0) return s;
                                                          return String.format("%0" + (n - s.length()) + "d%s", 0, s);
                                                          }


                                                          The result should come out like the following



                                                          -1
                                                          -a
                                                          0
                                                          1
                                                          1.0
                                                          1.01
                                                          1.1.1
                                                          1a
                                                          1b
                                                          9
                                                          10
                                                          10a
                                                          10ab
                                                          11
                                                          12
                                                          12abcd
                                                          100
                                                          a
                                                          a1a1
                                                          a1a2
                                                          a-1
                                                          a-2
                                                          áviacion
                                                          b
                                                          c1
                                                          c2
                                                          c12
                                                          c100
                                                          d
                                                          d1.1.1
                                                          e





                                                          share|improve this answer


























                                                            0












                                                            0








                                                            0






                                                            Instead of trying to write some function and slow down the SELECT query, I thought of another way of doing this...



                                                            Create an extra field in your database that holds the result from the following Class and when you insert a new row, run the field value that will be naturally sorted through this class and save its result in the extra field. Then instead of sorting by your original field, sort by the extra field.



                                                            String nsFieldVal = new NaturalSortString(getFieldValue(), 4).toString()



                                                            The above means:
                                                            - Create a NaturalSortString for the String returned from getFieldValue()
                                                            - Allow up to 4 bytes to store each character or number (4 bytes = ffff = 65535)

                                                            | field(32) | nsfield(161) |
                                                            a1 300610001




                                                            String sortString = new NaturalSortString(getString(), 4).toString()



                                                            import StringUtils;

                                                            /**
                                                            * Creates a string that allows natural sorting in a SQL database
                                                            * eg, 0 1 1a 2 3 3a 10 100 a a1 a1a1 b
                                                            */
                                                            public class NaturalSortString {

                                                            private String inStr;
                                                            private int byteSize;
                                                            private StringBuilder out = new StringBuilder();

                                                            /**
                                                            * A byte stores the hex value (0 to f) of a letter or number.
                                                            * Since a letter is two bytes, the minimum byteSize is 2.
                                                            *
                                                            * 2 bytes = 00 - ff (max number is 255)
                                                            * 3 bytes = 000 - fff (max number is 4095)
                                                            * 4 bytes = 0000 - ffff (max number is 65535)
                                                            *
                                                            * For example:
                                                            * dog123 = 64,6F,67,7B and thus byteSize >= 2.
                                                            * dog280 = 64,6F,67,118 and thus byteSize >= 3.
                                                            *
                                                            * For example:
                                                            * The String, "There are 1000000 spots on a dalmatian" would require a byteSize that can
                                                            * store the number '1000000' which in hex is 'f4240' and thus the byteSize must be at least 5
                                                            *
                                                            * The dbColumn size to store the NaturalSortString is calculated as:
                                                            * > originalStringColumnSize x byteSize + 1
                                                            * The extra '1' is a marker for String type - Letter, Number, Symbol
                                                            * Thus, if the originalStringColumn is varchar(32) and the byteSize is 5:
                                                            * > NaturalSortStringColumnSize = 32 x 5 + 1 = varchar(161)
                                                            *
                                                            * The byteSize must be the same for all NaturalSortStrings created in the same table.
                                                            * If you need to change the byteSize (for instance, to accommodate larger numbers), you will
                                                            * need to recalculate the NaturalSortString for each existing row using the new byteSize.
                                                            *
                                                            * @param str String to create a natural sort string from
                                                            * @param byteSize Per character storage byte size (minimum 2)
                                                            * @throws Exception See the error description thrown
                                                            */
                                                            public NaturalSortString(String str, int byteSize) throws Exception {
                                                            if (str == null || str.isEmpty()) return;
                                                            this.inStr = str;
                                                            this.byteSize = Math.max(2, byteSize); // minimum of 2 bytes to hold a character
                                                            setStringType();
                                                            iterateString();
                                                            }

                                                            private void setStringType() {
                                                            char firstchar = inStr.toLowerCase().subSequence(0, 1).charAt(0);
                                                            if (Character.isLetter(firstchar)) // letters third
                                                            out.append(3);
                                                            else if (Character.isDigit(firstchar)) // numbers second
                                                            out.append(2);
                                                            else // non-alphanumeric first
                                                            out.append(1);
                                                            }

                                                            private void iterateString() throws Exception {
                                                            StringBuilder n = new StringBuilder();
                                                            for (char c : inStr.toLowerCase().toCharArray()) { // lowercase for CASE INSENSITIVE sorting
                                                            if (Character.isDigit(c)) {
                                                            // group numbers
                                                            n.append(c);
                                                            continue;
                                                            }
                                                            if (n.length() > 0) {
                                                            addInteger(n.toString());
                                                            n = new StringBuilder();
                                                            }
                                                            addCharacter(c);
                                                            }
                                                            if (n.length() > 0) {
                                                            addInteger(n.toString());
                                                            }
                                                            }

                                                            private void addInteger(String s) throws Exception {
                                                            int i = Integer.parseInt(s);
                                                            if (i >= (Math.pow(16, byteSize)))
                                                            throw new Exception("naturalsort_bytesize_exceeded");
                                                            out.append(StringUtils.padLeft(Integer.toHexString(i), byteSize));
                                                            }

                                                            private void addCharacter(char c) {
                                                            //TODO: Add rest of accented characters
                                                            if (c >= 224 && c <= 229) // set accented a to a
                                                            c = 'a';
                                                            else if (c >= 232 && c <= 235) // set accented e to e
                                                            c = 'e';
                                                            else if (c >= 236 && c <= 239) // set accented i to i
                                                            c = 'i';
                                                            else if (c >= 242 && c <= 246) // set accented o to o
                                                            c = 'o';
                                                            else if (c >= 249 && c <= 252) // set accented u to u
                                                            c = 'u';
                                                            else if (c >= 253 && c <= 255) // set accented y to y
                                                            c = 'y';

                                                            out.append(StringUtils.padLeft(Integer.toHexString(c), byteSize));
                                                            }

                                                            @Override
                                                            public String toString() {
                                                            return out.toString();
                                                            }
                                                            }


                                                            For completeness, below is the StringUtils.padLeft method:



                                                            public static String padLeft(String s, int n) {
                                                            if (n - s.length() == 0) return s;
                                                            return String.format("%0" + (n - s.length()) + "d%s", 0, s);
                                                            }


                                                            The result should come out like the following



                                                            -1
                                                            -a
                                                            0
                                                            1
                                                            1.0
                                                            1.01
                                                            1.1.1
                                                            1a
                                                            1b
                                                            9
                                                            10
                                                            10a
                                                            10ab
                                                            11
                                                            12
                                                            12abcd
                                                            100
                                                            a
                                                            a1a1
                                                            a1a2
                                                            a-1
                                                            a-2
                                                            áviacion
                                                            b
                                                            c1
                                                            c2
                                                            c12
                                                            c100
                                                            d
                                                            d1.1.1
                                                            e





                                                            share|improve this answer














                                                            Instead of trying to write some function and slow down the SELECT query, I thought of another way of doing this...



                                                            Create an extra field in your database that holds the result from the following Class and when you insert a new row, run the field value that will be naturally sorted through this class and save its result in the extra field. Then instead of sorting by your original field, sort by the extra field.



                                                            String nsFieldVal = new NaturalSortString(getFieldValue(), 4).toString()



                                                            The above means:
                                                            - Create a NaturalSortString for the String returned from getFieldValue()
                                                            - Allow up to 4 bytes to store each character or number (4 bytes = ffff = 65535)

                                                            | field(32) | nsfield(161) |
                                                            a1 300610001




                                                            String sortString = new NaturalSortString(getString(), 4).toString()



                                                            import StringUtils;

                                                            /**
                                                            * Creates a string that allows natural sorting in a SQL database
                                                            * eg, 0 1 1a 2 3 3a 10 100 a a1 a1a1 b
                                                            */
                                                            public class NaturalSortString {

                                                            private String inStr;
                                                            private int byteSize;
                                                            private StringBuilder out = new StringBuilder();

                                                            /**
                                                            * A byte stores the hex value (0 to f) of a letter or number.
                                                            * Since a letter is two bytes, the minimum byteSize is 2.
                                                            *
                                                            * 2 bytes = 00 - ff (max number is 255)
                                                            * 3 bytes = 000 - fff (max number is 4095)
                                                            * 4 bytes = 0000 - ffff (max number is 65535)
                                                            *
                                                            * For example:
                                                            * dog123 = 64,6F,67,7B and thus byteSize >= 2.
                                                            * dog280 = 64,6F,67,118 and thus byteSize >= 3.
                                                            *
                                                            * For example:
                                                            * The String, "There are 1000000 spots on a dalmatian" would require a byteSize that can
                                                            * store the number '1000000' which in hex is 'f4240' and thus the byteSize must be at least 5
                                                            *
                                                            * The dbColumn size to store the NaturalSortString is calculated as:
                                                            * > originalStringColumnSize x byteSize + 1
                                                            * The extra '1' is a marker for String type - Letter, Number, Symbol
                                                            * Thus, if the originalStringColumn is varchar(32) and the byteSize is 5:
                                                            * > NaturalSortStringColumnSize = 32 x 5 + 1 = varchar(161)
                                                            *
                                                            * The byteSize must be the same for all NaturalSortStrings created in the same table.
                                                            * If you need to change the byteSize (for instance, to accommodate larger numbers), you will
                                                            * need to recalculate the NaturalSortString for each existing row using the new byteSize.
                                                            *
                                                            * @param str String to create a natural sort string from
                                                            * @param byteSize Per character storage byte size (minimum 2)
                                                            * @throws Exception See the error description thrown
                                                            */
                                                            public NaturalSortString(String str, int byteSize) throws Exception {
                                                            if (str == null || str.isEmpty()) return;
                                                            this.inStr = str;
                                                            this.byteSize = Math.max(2, byteSize); // minimum of 2 bytes to hold a character
                                                            setStringType();
                                                            iterateString();
                                                            }

                                                            private void setStringType() {
                                                            char firstchar = inStr.toLowerCase().subSequence(0, 1).charAt(0);
                                                            if (Character.isLetter(firstchar)) // letters third
                                                            out.append(3);
                                                            else if (Character.isDigit(firstchar)) // numbers second
                                                            out.append(2);
                                                            else // non-alphanumeric first
                                                            out.append(1);
                                                            }

                                                            private void iterateString() throws Exception {
                                                            StringBuilder n = new StringBuilder();
                                                            for (char c : inStr.toLowerCase().toCharArray()) { // lowercase for CASE INSENSITIVE sorting
                                                            if (Character.isDigit(c)) {
                                                            // group numbers
                                                            n.append(c);
                                                            continue;
                                                            }
                                                            if (n.length() > 0) {
                                                            addInteger(n.toString());
                                                            n = new StringBuilder();
                                                            }
                                                            addCharacter(c);
                                                            }
                                                            if (n.length() > 0) {
                                                            addInteger(n.toString());
                                                            }
                                                            }

                                                            private void addInteger(String s) throws Exception {
                                                            int i = Integer.parseInt(s);
                                                            if (i >= (Math.pow(16, byteSize)))
                                                            throw new Exception("naturalsort_bytesize_exceeded");
                                                            out.append(StringUtils.padLeft(Integer.toHexString(i), byteSize));
                                                            }

                                                            private void addCharacter(char c) {
                                                            //TODO: Add rest of accented characters
                                                            if (c >= 224 && c <= 229) // set accented a to a
                                                            c = 'a';
                                                            else if (c >= 232 && c <= 235) // set accented e to e
                                                            c = 'e';
                                                            else if (c >= 236 && c <= 239) // set accented i to i
                                                            c = 'i';
                                                            else if (c >= 242 && c <= 246) // set accented o to o
                                                            c = 'o';
                                                            else if (c >= 249 && c <= 252) // set accented u to u
                                                            c = 'u';
                                                            else if (c >= 253 && c <= 255) // set accented y to y
                                                            c = 'y';

                                                            out.append(StringUtils.padLeft(Integer.toHexString(c), byteSize));
                                                            }

                                                            @Override
                                                            public String toString() {
                                                            return out.toString();
                                                            }
                                                            }


                                                            For completeness, below is the StringUtils.padLeft method:



                                                            public static String padLeft(String s, int n) {
                                                            if (n - s.length() == 0) return s;
                                                            return String.format("%0" + (n - s.length()) + "d%s", 0, s);
                                                            }


                                                            The result should come out like the following



                                                            -1
                                                            -a
                                                            0
                                                            1
                                                            1.0
                                                            1.01
                                                            1.1.1
                                                            1a
                                                            1b
                                                            9
                                                            10
                                                            10a
                                                            10ab
                                                            11
                                                            12
                                                            12abcd
                                                            100
                                                            a
                                                            a1a1
                                                            a1a2
                                                            a-1
                                                            a-2
                                                            áviacion
                                                            b
                                                            c1
                                                            c2
                                                            c12
                                                            c100
                                                            d
                                                            d1.1.1
                                                            e






                                                            share|improve this answer














                                                            share|improve this answer



                                                            share|improve this answer








                                                            edited Nov 28 '17 at 18:12

























                                                            answered Nov 28 '17 at 0:25









                                                            Christian

                                                            2,23012143




                                                            2,23012143























                                                                0














                                                                If you need to sort an alpha-numeric column that does not have any standard format whatsoever



                                                                SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC


                                                                You can adapt this solutation to include support for non-alphanumeric characters if desired using additional logic.






                                                                share|improve this answer


























                                                                  0














                                                                  If you need to sort an alpha-numeric column that does not have any standard format whatsoever



                                                                  SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC


                                                                  You can adapt this solutation to include support for non-alphanumeric characters if desired using additional logic.






                                                                  share|improve this answer
























                                                                    0












                                                                    0








                                                                    0






                                                                    If you need to sort an alpha-numeric column that does not have any standard format whatsoever



                                                                    SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC


                                                                    You can adapt this solutation to include support for non-alphanumeric characters if desired using additional logic.






                                                                    share|improve this answer












                                                                    If you need to sort an alpha-numeric column that does not have any standard format whatsoever



                                                                    SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC


                                                                    You can adapt this solutation to include support for non-alphanumeric characters if desired using additional logic.







                                                                    share|improve this answer












                                                                    share|improve this answer



                                                                    share|improve this answer










                                                                    answered Dec 28 '17 at 18:54









                                                                    Weston Ganger

                                                                    2,72812428




                                                                    2,72812428























                                                                        0














                                                                        This works for type of data:
                                                                        Data1,
                                                                        Data2, Data3 ......,Data21. Means "Data" String is common in all rows.



                                                                        For ORDER BY ASC it will sort perfectly, For ORDER BY DESC not suitable.



                                                                        SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;





                                                                        share|improve this answer


























                                                                          0














                                                                          This works for type of data:
                                                                          Data1,
                                                                          Data2, Data3 ......,Data21. Means "Data" String is common in all rows.



                                                                          For ORDER BY ASC it will sort perfectly, For ORDER BY DESC not suitable.



                                                                          SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;





                                                                          share|improve this answer
























                                                                            0












                                                                            0








                                                                            0






                                                                            This works for type of data:
                                                                            Data1,
                                                                            Data2, Data3 ......,Data21. Means "Data" String is common in all rows.



                                                                            For ORDER BY ASC it will sort perfectly, For ORDER BY DESC not suitable.



                                                                            SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;





                                                                            share|improve this answer












                                                                            This works for type of data:
                                                                            Data1,
                                                                            Data2, Data3 ......,Data21. Means "Data" String is common in all rows.



                                                                            For ORDER BY ASC it will sort perfectly, For ORDER BY DESC not suitable.



                                                                            SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;






                                                                            share|improve this answer












                                                                            share|improve this answer



                                                                            share|improve this answer










                                                                            answered Jun 25 '18 at 9:15









                                                                            ShivBuyya

                                                                            8781111




                                                                            8781111






























                                                                                draft saved

                                                                                draft discarded




















































                                                                                Thanks for contributing an answer to Stack Overflow!


                                                                                • Please be sure to answer the question. Provide details and share your research!

                                                                                But avoid



                                                                                • Asking for help, clarification, or responding to other answers.

                                                                                • Making statements based on opinion; back them up with references or personal experience.


                                                                                To learn more, see our tips on writing great answers.





                                                                                Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                                                                Please pay close attention to the following guidance:


                                                                                • Please be sure to answer the question. Provide details and share your research!

                                                                                But avoid



                                                                                • Asking for help, clarification, or responding to other answers.

                                                                                • Making statements based on opinion; back them up with references or personal experience.


                                                                                To learn more, see our tips on writing great answers.




                                                                                draft saved


                                                                                draft discarded














                                                                                StackExchange.ready(
                                                                                function () {
                                                                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f8557172%2fmysql-order-by-sorting-alphanumeric-correctly%23new-answer', 'question_page');
                                                                                }
                                                                                );

                                                                                Post as a guest















                                                                                Required, but never shown





















































                                                                                Required, but never shown














                                                                                Required, but never shown












                                                                                Required, but never shown







                                                                                Required, but never shown

































                                                                                Required, but never shown














                                                                                Required, but never shown












                                                                                Required, but never shown







                                                                                Required, but never shown







                                                                                Popular posts from this blog

                                                                                Xamarin.iOS Cant Deploy on Iphone

                                                                                Glorious Revolution

                                                                                Dulmage-Mendelsohn matrix decomposition in Python