2011-01-06 4 views
0

Что мне нужно сделать, это заказать их из класса, лабораторий, лекционных залов и аудиторий. То, что мне тогда нужно сделать, - это упорядочить их по их идентификатору. Поэтому для классных комнат я начинаю с 1 и поднимаюсь соответственно.Использование ASC/DESC в ORDER BY CASE()

Единственными полями, которые я использую, являются идентификаторы roomID и столбца типа. (Если изменить тип видя, как это функция SQL да?)

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 

Это кажется достаточно простым, но я не могу заставить его работать. Таким образом, любая помощь была бы весьма признательна, тем более, что это, вероятно, глупый вопрос.

ответ

2

Кажется, что вам следует сделать, это положить этот оператор case в поля запроса и дать ему псевдоним. Затем установите для своего утверждения по порядку этот псевдоним.

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 

Если я правильно помню, это должно сработать.

+0

+1 @spinon, вы, вероятно, правы, но я подозреваю, что это не работает одинаково для разных дБ. например некоторые, где требуется ваша, и некоторые, где Syed Abdul Rahman's –

+0

Это работает! Последняя строка должна быть ORDER BY roomID, но спасибо. Поэтому, если мне нужно что-то заказать ASC или DESC, мне придется сначала «сгруппировать» другой CASE. –

+0

@conrad, вы, вероятно, правы. Не было никакого тэга относительно того, с чем он работал, поэтому я просто выбросил его туда, где это возможно. – spinon

1

Только в случае, если ответ спинонных не работает для вас всегда можете сделать это в линию зрения

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

Итак, этот код в определенном смысле создает новый столбец, в котором отображается, с каким CASE они находятся? –

+0

@Syed Абдул Рахман. Оба подхода делают это. Основное отличие состоит в том, что это гарантирует, что «ClassTypeValue» будет распознаваться ORDER BY. Одно незначительное преимущество, которое вам может не нравиться, ClassTypeValue не должно появляться в 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 

Это последний вопрос, о котором я использовал. Спасибо, ребята, что помогли мне и объяснили это мне.