2013-05-22 4 views
0

Чтобы проверить эти запросы, я запускаю их в мастере запросов SQL в Microsoft Access. Я пытаюсь изменить существующий php-файл, чтобы отображать предупреждения о высоком приоритете (O и P) наверху, которые затем упорядочиваются opslogid в порядке убывания. После того, как больше нет предупреждений о статусе O и P, я хочу отображать остальные предупреждения о состоянии (A, I, R), упорядоченные по opslogid в порядке убывания. Это данные выборки и требуемая выходная мощность:Сортировка после объединения Все

tblOpslog 

opslogid = 9999, 9998, etc. 
status = R, O, I, A, P 

opslogid        status 
9999          P 
9996          P 
9994          O 
9991          O 
9998          I 
9997          I 
9980          A 
9979          A 
9978          A 
9930          R 
9928          R 

Мой коллега предложил мне использовать объединение всех команд, которые привели меня придумать с этим:

Примечание: «ГДЕ DELETED И NOVIEW ДОЛЖНЫ ОСТАВАТЬСЯ В ЗАКЛЮЧЕНИИ, ЭТО ВИДИТ В ВЫХОДЕ БАЗА ДАННЫХ ». ТАКЖЕ Я НЕ МОГУ СДЕЛАТЬ ЛЮБЫЕ ИЗМЕНЕНИЯ НА БАЗЕ ДАННЫХ.

select * from (SELECT * FROM tblOpslog 
Where Deleted = No AND Noview = No AND status in ('O','P')) 
union all 
select * from (Select * FROM tblOpslog Where Deleted = No AND Noview = No AND status in ('I','R', 'A')) 
Order by status, opslogid DESC; 

Выход этого:

opslogid        status 
9980          A 
9979          A 
9978          A 
9998          I 
9997          I 
9994          O 
9991          O 
9999          P 
9996          P 
9930          R 
9928          R 

Я был бы очень признателен, если кто-то может кто-то посоветует, что исправить/добавить в код, чтобы отобразить желаемый результат? Спасибо

ответ

1

Поскольку ваша упорядоченность status не алфавитная, вы должны использовать выражение CASE, чтобы контролировать порядок:

SELECT * 
FROM tblOpsLog 
WHERE Deleted = No AND Noview = No AND status IN ('A', 'I', 'R', 'O', 'P') 
ORDER BY CASE WHEN status IN ('O', 'P') then 1 
       ELSE 2 
     END, opslogid DESC 

Что вы пытались бы работали в MySQL, так как он заказывает каждую ветвь a UNION отдельно. Но другие двигатели SQL применяют ORDER BY к целому UNION.

SQLFIDDLE

+0

Будет ли получить желаемый выход? С P и O в верхней части страницы с их идентификаторами в порядке убывания, а затем A, I, R после их идентификаторов в порядке убывания? Вы только обратились к P и O в своем заявлении. –

+0

Я обрабатываю A, I, R с помощью 'ELSE 2'. – Barmar

+0

Я добавил что-то к предложению 'WHERE', чтобы получить только 5 статусов. – Barmar

Смежные вопросы