MySQL按标题排序,然后分组ID

MySQL按标题排序,然后分组ID,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有一个表,其中包含可以按任务分组的任务 我想知道是否有一种方法可以从表中选择任务,其顺序将子任务按标题排序直接放在父任务(按标题排序)的下面。只有一层子节点(即,任何行都不能有不在顶层的父节点) 下面是一个例子表和小提琴。在本例中,所需的输出为: TaskID ParentTaskID Title ---------------------------------- 6 NULL A Task 3 1 NULL Task 1 7 1

我有一个表,其中包含可以按任务分组的任务

我想知道是否有一种方法可以从表中选择任务,其顺序将子任务按标题排序直接放在父任务(按标题排序)的下面。只有一层子节点(即,任何行都不能有不在顶层的父节点)

下面是一个例子表和小提琴。在本例中,所需的输出为:

TaskID ParentTaskID Title
----------------------------------
6      NULL         A Task 3
1      NULL         Task 1
7      1            Task 1 A Sub 3
3      1            Task 1 Sub 1
4      1            Task 1 Sub 2
2      NULL         Task 2
5      2            Task 2 Sub 1


第一个顺序是确保任务和子任务分组在一起,然后空值(父项)将是第一个,最后子项将按标题排序

输出

+--------+--------------+----------+--------+--------------+----------------+
| TaskID | ParentTaskID |  Title   | TaskID | ParentTaskID |     Title      |
+--------+--------------+----------+--------+--------------+----------------+
|      6 |              | A Task 3 |      6 |              | A Task 3       |
|      1 |              | Task 1   |      1 |              | Task 1         |
|      1 |              | Task 1   |      7 |            1 | Task 1 A Sub 3 |
|      1 |              | Task 1   |      3 |            1 | Task 1 Sub 1   |
|      1 |              | Task 1   |      4 |            1 | Task 1 Sub 2   |
|      2 |              | Task 2   |      2 |              | Task 2         |
|      2 |              | Task 2   |      5 |            2 | Task 2 Sub 1   |
+--------+--------------+----------+--------+--------------+----------------+

在MySQL 8+中,您可以使用
ORDER BY
中的窗口函数来实现这一点:

SELECT *
FROM Tasks
ORDER BY MAX(CASE WHEN ParentTaskId IS NULL THEN Title END) OVER (PARTITION BY COALESCE(ParentTaskId, TaskId)),  -- parent title
         COALESCE(ParentTaskId, TaskId),  -- parent id in case titles match
         (ParentTaskId IS NULL) DESC,     -- parent first
         Title;

是一把小提琴。

太棒了,谢谢。我将其更改为
按标题排序、合并(ParentTaskID,TaskID)、ParentTaskID,Title
,以使顶级任务也按标题排序。很好。在我完成回答后,我看到了这个要求,但不确定如何解决它。实际上,这并没有解决它,它只是碰巧解决了示例数据集的问题:(很抱歉,这只起作用,因为第一个标题旁边的所有标题都是“任务…”更改任何人都不起作用。我不认为你能满足你想要的确切要求。我会考虑一下,但似乎不容易。我做到了。我使用自连接将孩子与家长的标题指定为相同的标题。因此可以先按家长标题排序。谦虚地说,我很好有时我会害怕:)
+--------+--------------+----------+--------+--------------+----------------+
| TaskID | ParentTaskID |  Title   | TaskID | ParentTaskID |     Title      |
+--------+--------------+----------+--------+--------------+----------------+
|      6 |              | A Task 3 |      6 |              | A Task 3       |
|      1 |              | Task 1   |      1 |              | Task 1         |
|      1 |              | Task 1   |      7 |            1 | Task 1 A Sub 3 |
|      1 |              | Task 1   |      3 |            1 | Task 1 Sub 1   |
|      1 |              | Task 1   |      4 |            1 | Task 1 Sub 2   |
|      2 |              | Task 2   |      2 |              | Task 2         |
|      2 |              | Task 2   |      5 |            2 | Task 2 Sub 1   |
+--------+--------------+----------+--------+--------------+----------------+
SELECT *
FROM Tasks
ORDER BY MAX(CASE WHEN ParentTaskId IS NULL THEN Title END) OVER (PARTITION BY COALESCE(ParentTaskId, TaskId)),  -- parent title
         COALESCE(ParentTaskId, TaskId),  -- parent id in case titles match
         (ParentTaskId IS NULL) DESC,     -- parent first
         Title;