0

为了测试这些查询,我在 Microsoft Access 的 SQL 查询向导中运行它们。我正在尝试修改现有的 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

我的同事建议我使用 union all 命令,这导致我想出了这个:

注意:“在查询中必须保留已删除和 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

如果有人可以建议修复/添加到代码中以显示所需的输出,我将不胜感激?谢谢

4

1 回答 1

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

于 2013-05-22T22:56:35.167 回答