某些情况下的 SQL 特殊排序顺序
Posted
技术标签:
【中文标题】某些情况下的 SQL 特殊排序顺序【英文标题】:SQL special sort order under certain circumstances 【发布时间】:2014-06-26 15:40:22 【问题描述】:我有以下场景:
我有一份支持票列表 每张支持票都有许多消息(带有自己的日期时间) 每张工单都有一个状态(打开、customerResponded、waitingForCustomer、关闭)整个表应该按虚构的优先级排序,这意味着:
open
和 customerResponded
具有相同的优先级,因此这些项目按最新工单消息 ASC 的日期时间排序(应首先处理最长的未触及工单,以此类推)。
waitingForCustomer
的优先级较低。因此,waitingForCustomer
的工单总是在状态为 open
或 customerResponded
的工单后面,并且这些工单按日期时间 DESC 排序(因为客户从未回复过的旧工单的相关性较低)。
closed
与 waitingForCustomer
工作方式相同,但优先级更低,因此这些工单位于列表末尾。
所以,在我解释了这个场景之后,我有以下问题:
是否可以向 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 特殊排序顺序的主要内容,如果未能解决你的问题,请参考以下文章