postgresql - 查询按 id 和parent_id 对行进行排序

标签 postgresql

我有一个包含嵌套数据的简单表,我需要按 idparent_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

请参阅demo .
结果:

> 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

关于postgresql - 查询按 id 和parent_id 对行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64061344/

相关文章:

java - 使用hibernate时出现空指针异常

sql - Postgresql:从数字开始提取文本

postgresql - Julia 0.6 到 Postgres 的连接 - 可用选项和 LibPq.jl

sql - 有条件地找到不同的计数

sql - 水平选择每组的第一条和最后一条记录

postgresql - "polymorphism"用于 FOREIGN KEY 约束

sql - postgres根据条件执行存储过程

postgresql - 返回 0 行时 GIN 索引不用于小表

sql - 如何使用 CASE 来更改从数据库检索的数据

sql - 在未嵌套的 jsonb 列上优化 GROUP BY + COUNT DISTINCT