postgresql - 查询按 id 和 parent_id 对行进行排序
问题描述
我有一个包含嵌套数据的简单表,我需要对行进行id
排序parent_id
这是实际的表:
select * from commission_category;
+----+-------+-----------+
| id | code | parent_id |
+----+-------+-----------+
| -1 | " " | null |
| 1 | "AU" | null |
| 7 | "AI" | null |
| 8 | "AEM" | null |
| 9 | "SPE" | null |
| 10 | "AEN" | null |
| 11 | "FV" | null |
| 13 | "PRO" | null |
| 17 | "AF" | 9 |
| 12 | "IND" | 1 |
| 15 | "CIV" | 9 |
| 16 | "CON" | 1 |
+----+-------+-----------+
这是所需的顺序:
+----+-------+-----------+
| id | code | parent_id |
+----+-------+-----------+
| -1 | " " | null |
| 1 | "AU" | null |
| 16 | "CON" | 1 |
| 12 | "IND" | 1 |
| 7 | "AI" | null |
| 8 | "AEM" | null |
| 9 | "SPE" | null |
| 17 | "AF" | 9 |
| 15 | "CIV" | 9 |
| 10 | "AEN" | null |
| 11 | "FV" | null |
| 13 | "PRO" | null |
+----+-------+-----------+
我需要的顺序需要在id
之后按顺序订购表格parent_id
。parent_id
需要附近的行与之对应id
。
示例:
第一行id = 1
是parent_id
下一行的。
| 1 | "AU" | null |
| 16 | "CON" | 1 |
| 12 | "IND" | 1 |
这是我制作的:
select * from (select * from commission_category order by id asc) subs order by subs.parent_id desc
+----+-------+-----------+
| id | code | parent_id |
+----+-------+-----------+
| -1 | " " | null |
| 1 | "AU" | null |
| 7 | "AI" | null |
| 8 | "AEM" | null |
| 9 | "SPE" | null |
| 10 | "AEN" | null |
| 11 | "FV" | null |
| 13 | "PRO" | null |
| 17 | "AF" | 9 |
| 15 | "CIV" | 9 |
| 16 | "CON" | 1 |
| 12 | "IND" | 1 |
+----+-------+-----------+
我在查询中遗漏了什么?
解决方案
您需要多个级别的排序:
select *
from commission_category
order by coalesce(parent_id, id),
(parent_id is null)::int desc,
id desc
请参阅演示。
结果:
> id | code | parent_id
> -: | :--- | --------:
> -1 | | null
> 1 | AU | null
> 16 | CON | 1
> 12 | IND | 1
> 7 | AI | null
> 8 | AEM | null
> 9 | SPE | null
> 17 | AF | 9
> 15 | CIV | 9
> 10 | AEN | null
> 11 | FV | null
> 13 | PRO | null