MySQL如何部分订购结果集?

时间:2012-04-13 10:14:41

标签: mysql sql-order-by

如果我有一组结果,例如可视化时看起来像[ status | date ]:

[1|2012/01/06],[2|2011/04/23],[3|2012/02/12],[1|2012/11/26],[2|2012/10/13],[3|2010/03/01],[3|2010/06/27]

如何订购结果,以便状态为1的行具有优先级超过状态'为2& 3然后按日期订购那些“拆分”结果?

如果我通过ASC订购状态,那么我最终得到:

[1|2012/01/06],[1|2012/11/26],[2|2011/04/23],[2|2012/10/13],[3|2012/02/12],[3|2010/03/01],[3|2010/06/27]

这将状态'2和'分开。 3。 我想要一个结果集,如下所示:

[1|2012/01/06],[1|2012/11/26],[3|2012/02/12],[3|2010/03/01],[2|2011/04/23],[3|2010/06/27],[2|2012/10/13]

tl; dr我想通过状态1或状态>来订购我的结果。比1.我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以尝试以下方法 -

ORDER BY IF(status = 1, 1, 2) ASC, date ASC

答案 1 :(得分:1)

我会为此做2次查询,因为你要求2件事。含义:你要求status = 1并且你要求除了1个以外的所有东西。

这是两个单独的问题,为什么要将它们保存在一个查询中呢?它会在查询中创建更多复杂性。 MySQL在简单查询方面非常快。这也允许清晰的模型函数,例如:

 $Model->getByStatus(1)
 $Model->getByStatus(array(2,3))

您还可以为它们创建单独的功能,例如:

 $Model->getPriorityTickets()
 $Model->getNonPriorityTickets()

这创建了一个更具可读性的选项,它实际上描述了业务,并且不需要控制器知道有关状态ID的任何信息。例如,您可以在getPriorityTickets中使用另一种方法来定义哪些记录具有优先权:id = 1 OR latest_modified> 2天前