2010-08-18 8 views
3

J'ai une table de produit avec un nom de produit, deux champs d'attributs de produit, et un champ de prix.mysql ordre par champ (avec une torsion)

Le problème est que je ne peux pas changer la façon dont la base de données est structurée. Chaque champ d'attribut est équivalent et peut être utilisé.

essentiellement:

NAME  | ATTRIBUTE_1 | ATTRIBUTE_2 | PRICE 
Tshirt | red   | small  | 25 
Tshirt | medium  | red   | 20 
Tshirt | blue  | medium  | 30 
Tshirt | blue  | large  | 16 

Pas le meilleur mis en place mais c'est comme ça ...

Je veux faire une requête qui procédez comme suit:

Afficher tous les bleu t-shirts d'abord et les commander par prix Afficher tous les autres T-shirts classés par prix après

Je pensais quelque chose comme ordre par domaine , mais puisque la couleur peut être soit dans l'attribut 1 ou 2 ces champs doivent être équivalents.

Des suggestions?

Répondre

3
SELECT NAME, ATTRIBUTE_1, ATTRIBUTE_2, PRICE 
FROM products 
ORDER BY (ATTRIBUTE_1 = 'blue' OR ATTRIBUTE_2 = 'blue') DESC, PRICE 

(ATTRIBUTE_1 = 'blue' OR ATTRIBUTE_2 = 'blue') sera 1 si elle est vraie, 0 si elle est fausse, le tri ainsi de suite que dans l'ordre décroissant triera les lignes qui ont une valeur d'attribut de bleu premier.

+0

Merci pour votre réponse. Je vote la solution parce que c'est un peu plus simple. – Enkay

2
select name, attribute_1, attribute_2, price 
from Product 
order by 
    case 
     when ATTRIBUTE_1 = 'blue' or ATTRIBUTE_2 = 'blue' then 0 
     else 1 
    end, 
    price 
+0

Merci pour votre réponse. Je comprends mieux les cas maintenant! – Enkay