2012-03-26 3 views
1

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

Примеры идентификаторы:

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?

ответ

1

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

В то же время, вы можете использовать это:

ORDER BY 
    CAST(SUBSTRING_INDEX(REPLACE(tID, 'w', ''), '.', 1) AS SIGNED INT) 
    , CAST(SUBSTRING_INDEX(tID, '.', -1) AS SIGNED INT) 
+0

Поскольку не так много записей до сих пор я, вероятно, пойти с этим. – JNK

1

Возможно

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

Имейте в виду, эти функции необходимо operatate на каждой строке в таблице, так что если это большой рассмотреть возможность использования что-то остальное.

+0

Это теперь ставит w1.12 infront от w1.1 в отличие от предыдущего. – JNK

0

Возможно, более эффективно просто передать результаты и выполнить сортировку на языке, который вызывает 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. 
?> 
Смежные вопросы