2011-01-06 2 views
0

Ce que je dois faire est de les commander dans les salles de classe, les laboratoires, les amphithéâtres et les auditoriums. Ce que je dois alors faire est de les organiser par leur identification. Donc pour les classes, je commence à partir de 1 et monte en conséquence.Utilisation de ASC/DESC dans un ORDER BY CASE()

Les seuls champs que j'utilise sont le roomID et la colonne type. (Devrait changer le type de voir que la façon dont il est une fonction SQL hein?)

SELECT * 
    FROM `rooms` 
ORDER BY CASE WHEN `type` = 'Classroom' 
    THEN 1 
    WHEN `type` = 'Computer laboratory' 
    THEN 2 
    WHEN `type` = 'Lecture Hall' 
    THEN 3 
    WHEN `type` = 'Auditorium' 
    THEN 4 
    END 

Il semble assez simple, mais je ne peux pas le faire fonctionner. Donc, toute aide serait grandement appréciée, d'autant plus qu'il s'agit probablement d'une question stupide.

Répondre

2

Ce que vous devriez faire est de mettre cette instruction dans vos champs de requête et de lui donner un alias. Ensuite, définissez votre ordre par instruction pour utiliser cet alias.

SELECT *, 
CASE 
WHEN type = 'Classroom' THEN 1 
WHEN type = 'Computer laboratory' THEN 2 
WHEN type = 'Lecture Hall' THEN 3 
WHEN type = 'Auditorium' THEN 4 
END AS ClassTypeValue 
FROM rooms 
ORDER BY ClassTypeValue 

Si je me souviens bien, cela devrait fonctionner.

+0

+1 @spinon vous avez probablement raison, mais je suppose que cela ne fonctionne pas de la même manière sur différents dBs. par exemple. certains où le vôtre est nécessaire et certains où Syed Abdul Rahman est –

+0

Cela fonctionne! La dernière ligne devrait être ORDER BY roomID, mais merci. Donc, si j'ai besoin de commander quelque chose par ASC ou DESC, je dois d'abord 'grouper' l'autre CAS. –

+0

@conrad vous avez probablement raison. Il n'y avait pas d'étiquette pour savoir avec quoi il travaillait, alors je l'ai juste jetée là-bas comme une possibilité. – spinon

1

Juste au cas où la réponse de spinon ne fonctionne pas pour vous pouvez toujours faire un en ligne vue

SELECT * 
FROM 
(

    SELECT *, 
     CASE 
     WHEN type = 'Classroom' THEN 1 
     WHEN type = 'Computer laboratory' THEN 2 
     WHEN type = 'Lecture Hall' THEN 3 
     WHEN type = 'Auditorium' THEN 4 
     END AS ClassTypeValue 
    FROM rooms 
) t 
ORDER BY ClassTypeValue 
+0

Donc, dans un sens, ce code crée une nouvelle colonne qui indique dans quel CAS ils se trouvent? –

+0

@Syed Abdul Rahman. Les deux approches le font. La principale différence est que cela s'assure que 'ClassTypeValue' sera reconnu par ORDER BY. Un avantage mineur dont vous ne vous souciez pas, le ClassTypeValue ne doit pas apparaître dans le SELECT. –

0
SELECT * 
FROM 
    (
    SELECT *, 
     CASE 
     WHEN type = 'Classroom' THEN 1 
     WHEN type = 'Computer laboratory' THEN 2 
     WHEN type = 'Lecture Hall' THEN 3 
     WHEN type = 'Auditorium' THEN 4 
     END AS ClassTypeValue 
    FROM rooms 
    ) t 
ORDER BY ClassTypeValue, maxppl, roomID 

Ceci est la dernière question dont je. Merci les gars de m'avoir aidé et de m'avoir expliqué.

Questions connexes