MySql查询 - 需要基于条件的'ORDER BY'选项

时间:2013-12-16 11:56:42

标签: mysql sql

我有一张桌子,结构如下: -

Where i_status means
i_status 0 = Active
i_status 1 = Archived
i_status 2 = Deleted

and fk_replaced_by_id contains the active records id that will be considered parent record.

Table structure is

id--completion_date--i_status--fk_replaced_by_id
1 --15-Dec-2013    --0       --0
2 --15-Dec-2013    --0       --0
3 --14-Dec-2013    --2       --0
4 --07-Dec-2013    --1       --1
5 --08-Dec-2013    --1       --1
6 --13-Dec-2013    --0       --0

我想在订单Order by completion_date, and archived records should be under the parent, and in deleted should be in last中显示商家信息: -

id--completion_date--i_status--fk_replaced_by_id
1 --15-Dec-2013    --0       --0
4 --07-Dec-2013    --1       --1
5 --08-Dec-2013    --1       --1
2 --15-Dec-2013    --0       --0
6 --13-Dec-2013    --0       --0
3 --14-Dec-2013    --2       --0

我试过这个查询

SELECT *
FROM assessments
ORDER BY i_completion_date DESC, i_status ASC

但是这个查询只返回completion_date序列的顺序,但我总是需要有最大completetion_date的活动,并且该记录的归档应该在父记录之下。

请问好吗?

3 个答案:

答案 0 :(得分:2)

首先,强制所有“DELETED”记录结束(这不支持使用父引用删除),做一个case / when ......或者在这种情况下使用MySQL和IF()

if(i_status = 2,2,1)

说明i_status = 2(已删除),我希望所有这些都在SECOND GROUP中排序,其他所有内容都在FIRST GROUP中。

现在,处理父母。如果有一个通过自我加入

,你也需要获得父母的完成日期
select
      YT.ID,
      YT.Completion_Date,
      YT.I_Status,
      YT.FK_Replaced_By_ID,
      YT2.Completion_Date as ParentCompleted
   from
      YourTable YT
         LEFT JOIN YourTable YT2
            ON YT.FK_Replaced_By_ID = YT2.ID
   order by
      IF( YT.I_Status = 2, 2, 1 ),
      IF( YT2.ID IS NULL, YT.Completion_Date, YT2.Completion_Date ) DESC,
      IF( YT2.ID IS NULL, YT.ID, YT2.ID ),
      YT.Completion_Date DESC

现在澄清其余的ORDER BY。

首先,IF()用于描述的状态。我们希望所有DELETED都通过2推到底部,以及第1组中考虑的任何其他内容。

下一个IF()。如果有父ID(通过自连接通过相同表的第二个实例中的匹配ID),则获取PARENT'S记录的日期(别名YT2)。如果没有父级,则它是自己的记录并使用自己的完成日期(别名YT)。这样,任何具有较旧日期的子记录都将上拉到与其父日期相同的日期分组,而不是分解为较旧的日期。

现在,如果同一天有很多事务,特别是因为没有时间戳引用,该怎么办?在这里我也说在同一天(上面的上一个IF())中,把记录按父ID或ID本身分组。以与完成日期类似的方式,父母和子女记录将全部聚集在一起。所以这个IF()使用ID或Parent ID来保持在一起。

最后,由于所有相应的SUBGROUPS已经建立,现在按照原始(非父母)记录的实际完成日期对其进行排序。

我想我错过了4/5记录的故障,这应该为你解决...而不是“YT.Completion_Date DESC”的最后一个订单,改为

   IF( YT2.ID IS NULL, 1, 2),
   YT.Completion_Date

这将首先强制使用父ID,然后按自然日期顺序执行其他操作。

答案 1 :(得分:0)

尝试按父级排序,而不是最后的状态和日期,如下所示:

SELECT *
FROM assessments
ORDER BY i_status ASC, fk_replaced_by_id ASC, i_completion_date DESC

我不知道你的父专栏是什么,你没有告诉我们。

答案 2 :(得分:0)

假设任何父级的fk_replaced_by_id0

SELECT *
FROM assessments
ORDER BY if( fk_replaced_by_id = 0, id, fk_replaced_by_id ), i_status