某些情况下的 SQL 特殊排序顺序

Posted

技术标签:

【中文标题】某些情况下的 SQL 特殊排序顺序【英文标题】:SQL special sort order under certain circumstances 【发布时间】:2014-06-26 15:40:22 【问题描述】:

我有以下场景:

我有一份支持票列表 每张支持票都有许多消息(带有自己的日期时间) 每张工单都有一个状态(打开、customerResponded、waitingForCustomer、关闭)

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

opencustomerResponded 具有相同的优先级,因此这些项目按最新工单消息 ASC 的日期时间排序(应首先处理最长的未触及工单,以此类推)。 waitingForCustomer 的优先级较低。因此,waitingForCustomer 的工单总是在状态为 opencustomerResponded 的工单后面,并且这些工单按日期时间 DESC 排序(因为客户从未回复过的旧工单的相关性较低)。 closedwaitingForCustomer 工作方式相同,但优先级更低,因此这些工单位于列表末尾。

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

是否可以向 ORDER BY 添加条件以使类似的事情成为可能,或者有其他方法可以实现吗?

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

【问题讨论】:

你想只在 mysql 中这样做吗?? 【参考方案1】:

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

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

【讨论】:

为什么在END之后是ASC和DESC?这是否意味着它不是条件的一部分(它实际上应该是什么)? 如果它在条件之内,你会得到一个语法错误。如果您选择的列是CASE WHEN status IN (0, 10) THEN Datetime END AS Alias,那么您将使用ORDER BY Alias ASC/DESC 进行排序,因此您所做的就是将Alias 替换为列中定义的完整case 语句。 我刚刚找到了一个基于你的解决方案,它到目前为止有效。 (不确定它是“脏”还是相当大)。作为答案发布。【参考方案2】:

感谢 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)在下级“组”中正确按日期排序。

【讨论】:

以上是关于某些情况下的 SQL 特殊排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

SQL按多列以不同顺序排序后选择奇数行

mysql in 排序 也可以按in里面的顺序来排序

如何对mySQL数据库中某些特定字段进行排序?

SQL Server的排序规则在啥时候能够进行设置或修改?

sql按某个字段值顺序排序

想问下,sql 按 in 后的顺序排序问题。