2010-10-22 8 views
3

J'ai obtenu un champ avec des tailles (VARCHAR). Les tailles peuvent avoir des valeurs int et string, par exemple. (1, 2, 3-4, X, XL, M, ...).mysql ordre par entier et varchar

quand on utilise la commande normale en fonction de la sortie mysql est le suivant: 1,10,11,2, 44-46, L, M, S, XL, XXL

Les valeurs qui ne ne pas contenir un nombre sont triés comme je veux le faire. (Je sais que les valeurs sont triées en tant que chaîne et le résultat est correct). Mais je veux commander les valeurs comme ceci: 1, 2, 3, 3-4, L, M, S, XL, XXL

Aussi un ordre plus "logique".

Est-ce possible avec msql?

+0

Est-ce un ensemble fini de valeurs autorisées? Si oui, utilisez enum http://dev.mysql.com/doc/refman/5.0/en/enum.html – vinothkr

+0

La taille est finie, mais il est possible que de nouvelles valeurs soient ajoutées, renommées ou supprimées. (Les valeurs de taille peuvent être modifiées dans un backend d'administration) – ipsum

Répondre

1

La solution la plus élégante et la plus flexible consiste à placer les tailles dans un tableau séparé et à utiliser JOINs. Par exemple, une définition de la table peut ressembler à ceci:

CREATE TABLE sizes (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    ord INT, 
    name VARCHAR(8) 
); 

Et dans ces tableaux où vous tailles utilisées précédemment, vous devez utiliser SIZE_ID:

CREATE TABLE tshirts (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    colour VARCHAR(16), 
    price INT, 
    size_id INT 
); 

Et lorsque vous interrogez, vous JOIN avec tailles, commande par sizes.ord et l'affichage sizes.name à l'utilisateur comme ceci:

SELECT colour, price, sizes.name FROM tshirts 
    JOIN sizes ON tshirts.size_id = sizes.id 
    ORDER BY sizes.ord; 

de cette façon, l'ordre des dimensions peut être indépendant du nom, et vous pouvez toujours les gérer en utilisant la table séparée.