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;