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

MySql查询-基于条件的查询需要“ORDER BY”选项,mysql,sql,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_repla

我有一张表,结构如下:-

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
我想按顺序显示列表,按完成日期排序,存档记录应位于父项下,而“in deleted”应位于最后:-

我试过这个问题

SELECT *
FROM assessments
ORDER BY i_completion_date DESC, i_status ASC
但这个查询只返回按完成日期顺序排列的顺序,但我总是需要活动的顶部有最大的完成日期,并且该记录的存档应该在父记录之下


有什么想法吗?

试着按家长顺序,而不是按最后的状态和日期,如下所示:

SELECT *
FROM assessments
ORDER BY i_status ASC, fk_replaced_by_id ASC, i_completion_date DESC
我不知道您的父列是什么,您不告诉我们。

假设任何父项的fk\u替换为\u id为0:


首先,要在末尾强制删除所有已删除的记录,而这不支持使用父引用删除记录,请执行case/when。。。或者在这种情况下使用MySQL和IF

如果i_状态=2,2,1

说明如果i_status=2已删除,则我希望所有这些都在第二组中排序,其他所有内容都在第一组中

现在,来处理家长。如果通过自连接有家长的完成日期,您也需要获得家长的完成日期

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
现在,请澄清订单的其余部分

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

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

现在,如果在同一日期有许多事务,尤其是因为没有时间戳引用,该怎么办。在这里,我也在说,在相同的日期内,如果上面提到,请将记录按父ID或ID本身分组。按照与完成日期类似的方式,父记录和子记录将全部集中在一起。因此,这是使用ID或父ID保持在一起

最后,由于已经建立了所有相应的子组,现在按照原始非父记录的实际完成日期对这些子组进行排序

我猜我错过了什么4/5的记录是无序的,这应该给你总结一下。。。更改为,而不是YT.Completion\u Date DESC的上一个订单

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

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

“fk\u替换为\u by\u ID”包含父记录ID第一优先级为活动记录,然后存档将列在活动记录下,然后删除。请尝试我的选择,是否有您需要的?它在您的订单中按i_状态排序,而不是py fk_替换为您的家长id?在i_状态组内,按日期排序。在仍在学习的同时,您的order by将把所有类似状态放在单独的组中,将活动和存档分开。如果删除状态为ID=1,活动状态为5,并且存在其他状态,该怎么办。也没有什么可以把父母/孩子的记录保存在一起。我没有关于正确答案的信息,作者想从我们这里得到。我不明白,为什么主题中ID的1,2,6在不同的位置,并试图帮助我阅读这些信息。@BaBL86,看看我的答案,如果仍然没有意义,请将每个order by视为它自己的一组内容,而不是一个实际的组,通过它意味着最小值、最大值、计数、平均值等聚合,然后在每一个常见的事物组中,将这些桩拆分为下一层桩。。因此,具有父项的项目与父项本身在同一堆中,并且根据父项的日期顺序相同。已删除的记录正在列出!!,但“ID”4和5应在“1”下,而不是properly@Suleman对不起,我不在。。。但是标记为ok。。。你做了些什么,或者你做了最后的调整。我看到了,并按条款调整了顺序。。请参阅结尾处的注释,仅替换按组件列出的最后完成日期订单。这不是问题-是的,当只为fk_添加了一个检查并将_替换为_id时,现在工作正常。我在db中又添加了一条记录,日期为“2013年12月16日”,我们的一个场景丢失,现在应该在顶部了?我们可以进行聊天讨论吗?
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
   IF( YT2.ID IS NULL, 1, 2),
   YT.Completion_Date