我们说下面有数据表:
+----+-----------+-----------+---------+
| id | name | parent_id | prev_id |
+----+-----------+-----------+---------+
| 1 | Section 1 | NULL | NULL |
| 2 | Item 1.1 | 1 | NULL |
| 3 | Item 1.2 | 1 | 2 |
| 4 | Item 1.3 | 1 | 3 |
| 5 | Section 2 | NULL | 1 |
| 6 | Item 2.1 | 5 | NULL |
| 7 | Item 2.2 | 5 | 6 |
| 8 | Item 2.3 | 5 | 7 |
| 9 | Item 1.4 | 1 | 4 |
+----+-----------+-----------+---------+
以下是它的工作原理:
parent_id
和prev_id
都是id
parent_id
用于区分部分和子部分(项目)parent_id
为NULL,那么它是一个部分;否则它是一个项目prev_id
用于表示prev_id
将指向上一部分的行;如果该行是项目,则prev_id
将指向prev_id
为NULL,则它是parent_id
和prev_id
都是NULL,则它是第一部分那么,是否有办法使用SQL对其进行排序,使其如下所示:
+----+-----------+-----------+---------+
| id | name | parent_id | prev_id |
+----+-----------+-----------+---------+
| 1 | Section 1 | NULL | NULL |
| 2 | Item 1.1 | 1 | NULL |
| 3 | Item 1.2 | 1 | 2 |
| 4 | Item 1.3 | 1 | 3 |
| 9 | Item 1.4 | 1 | 4 | <---
| 5 | Section 2 | NULL | 1 |
| 6 | Item 2.1 | 5 | NULL |
| 7 | Item 2.2 | 5 | 6 |
| 8 | Item 2.3 | 5 | 7 |
+----+-----------+-----------+---------+
我想这样
修改:这是我提出的查询:
SELECT id, name, parent_id, prev_id FROM
((
SELECT id, name, parent_id, prev_id, id AS some_id
FROM learning_paths
WHERE parent_id IS NULL
)
UNION ALL
(
SELECT id, name, parent_id, prev_id, parent_id AS some_id
FROM learning_paths
WHERE parent_id IS NOT NULL
)) t
ORDER BY t.some_id, prev_id
答案 0 :(得分:2)
此版本有效:
order by coalesce(parentid, id),
(parentid is null) desc,
coalesce(previd, parentid, id),
previd,
id
可能有更简单的版本。
Here是一个SQL小提琴(诚然在Postgres中,但不应该对这个问题产生影响)。