MYSQL расширенная сортировка - PullRequest
1 голос
/ 26 марта 2012

У меня есть таблица, полная идентификаторов (tID), которые создаются с буквой "w" в начале, за которой следуют число (int), точка и другое число (int).

Образцы идентификаторов:

w1.3, w1.12, w1.1, w1.1, w2.10, w2.4

Когда я использую ORDER BY tID, возвращается массив

w1.1, w1.12, w1.2, w1.3, w2.10, w2.4.

Я бы хотел, чтобы он был

w1.1, w1.2, w1.3, w1.12, w2.4, w2.10

Возможно ли это в запросе MYSQL?

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Возможно

select *
  from sorting 
 order by cast(substring(tID,2) as DECIMAL);

Имейте в виду, эти функции должны работать с каждой строкой в ​​таблице, поэтому, если она велика, подумайте об использовании чего-то еще.

1 голос
/ 26 марта 2012

Да, это возможно.Но вы должны рассмотреть возможность хранения только 2 целых чисел, без w и в 2 столбцах.

Тем временем вы можете использовать это:

ORDER BY
    CAST(SUBSTRING_INDEX(REPLACE(tID, 'w', ''), '.', 1) AS SIGNED INT)
  , CAST(SUBSTRING_INDEX(tID, '.', -1) AS SIGNED INT)
0 голосов
/ 26 марта 2012

Может быть эффективнее просто передать результаты обратно и выполнить сортировку на языке, который вызывает MySQL.

Например:

<?php
    $sql = mysql_query("select * from `sorting`");
    $arr = []; // Array() before PHP 5.4
    while($a = mysql_fetch_assoc($sql)) $arr[] = $a;
    usort($arr,function($a,$b) { // use create_function before PHP 5.3
        return strnatcasecmp($a['tID'],$b['tID']);
    });
    // $arr is now ordered the way you wanted it in the query
    // but there is no ordering in MySQL, which may improve performance
    // depending on the database engine you're using.
?>
...