2012-03-26 3 views
1

J'ai une table complète de id (tID) qui sont créés avec un "w" au début suivi d'un nombre (int) un point et un autre nombre (int).MYSQL tri avancé

id Exemples de:

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

Lorsque j'utilise ORDER BY tID le tableau retourné est

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

Je voudrais que ce soit

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

Est-ce possible dans une requête MYSQL?

Répondre

1

Oui, c'est possible. Mais vous devriez considérer stocker seulement les 2 entiers, sans le w et dans 2 colonnes.

En attendant, vous pouvez utiliser ceci:

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

Comme il n'y a pas beaucoup d'entrées jusqu'à présent, je vais probablement aller avec cela. – JNK

1

Il est possible

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

attention, ces fonctions doit operatate sur chaque ligne de la table, donc si elle est grande d'envisager d'utiliser quelque chose autre.

+0

Cela met maintenant w1.12 en face de w1.1 contrairement à avant. – JNK

0

Il peut être plus efficace de simplement renvoyer les résultats et de faire le tri dans la langue qui appelle MySQL.

Par exemple:

<?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. 
?>