在特定情况下SQL特殊排序顺序

时间:2014-06-26 15:40:23

标签: mysql sql sorting

我有以下情况:

  • 我有一张支持票据列表
  • 每张支持服务单都有许多消息(有自己的日期时间)
  • 每张门票都有一个状态(open,customerResponded,waitingForCustomer,closed)

整个表格应按虚构的优先级排序,这意味着:

  • opencustomerResponded具有相同的优先级,因此这些项目按最新票证消息ASC的日期时间排序(应首先处理最长的未更改票证,因此在列表顶部)。< / LI>
  • waitingForCustomer的优先级较低。因此,waitingForCustomer的票证总是落后于状态为opencustomerResponded的票证,并且这些票据按日期时间DESC排序(因为客户从未回复的旧票证不太相关)。< / LI>
  • closedwaitingForCustomer的工作方式相同,但优先级更低,因此这些故障单位于列表末尾。

所以,在我解释了这个场景后,我有以下问题:

是否可以为ORDER BY添加条件以使其成为可能,或者是否有其他方法可以实现?

编辑: 故障单状态是一个整数(open = 0,customerResponded = 10,waitingForCustomer = 20,closed = 100)。

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式在订单中使用案例表达式:

ORDER BY status,
        CASE WHEN status IN (0, 10) THEN Datetime END ASC,
        CASE WHEN status IN (20, 100) THEN Datetime END DESC

答案 1 :(得分:0)

感谢GarethD,我找到了一个解决方案,但与他有点不同:

ORDER BY
    CASE WHEN t.`ticket_status` IN (0, 10) THEN 0 ELSE t.`ticket_status` END ASC,
    CASE WHEN t.`ticket_status` IN (0, 10) THEN m.`message_created`
                                           ELSE -m.`message_created` END ASC

首先,我检查一下我的状态是open=0还是customerResponded=10

如果是这样,我按0排序(这意味着同样位于列表顶部)。

否则,我按故障单状态排序(waitingForCustomer的优先级高于closed)。

从属订单指令现在按message_created ASC-message_created ASC(技术上为message_created DESC)订购,以便在下属“组”中按日期排序。