Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 用于在Postgres中对子元素进行动态排序的查询_Postgresql - Fatal编程技术网

Postgresql 用于在Postgres中对子元素进行动态排序的查询

Postgresql 用于在Postgres中对子元素进行动态排序的查询,postgresql,Postgresql,我有一个如下所示的数据集(PostgresQL版本11),我想在其中添加一个带有小数点的排序列,以便在可视化中轻松映射父-子树 任何方法或查询,我们都可以做到这一点,尝试行数和排名,但这是没有帮助的 数据集: Parent Child Vitamine Vitamine Vitamin D Vitamin D Vitamin D Vitamin D3 Vitamin D Vitamin D K2 Vitamin D D3 Vitamin D Vitamin D

我有一个如下所示的数据集(PostgresQL版本11),我想在其中添加一个带有小数点的排序列,以便在可视化中轻松映射父-子树

任何方法或查询,我们都可以做到这一点,尝试行数和排名,但这是没有帮助的

数据集:

Parent      Child
Vitamine    Vitamine
Vitamin D   Vitamin D
Vitamin D   Vitamin D3
Vitamin D   Vitamin D K2
Vitamin D   D3
Vitamin D   Vitamin D 1000
Vitamin D   Vitamin D 10000
Vitamin D   Vitamin D 20000
Vitamin K2  Vitamin K2
Vitamin K2  Vitamin K
Vitamin K2  Vitamin K2 Mk7
Vitamin C   Vitamin C
预计产量

  Parent      Child             Sort_order
    Vitamine    Vitamine           1
    Vitamin D   Vitamin D          2
    Vitamin D   Vitamin D3         2.1
    Vitamin D   Vitamin D K2       2.2
    Vitamin D   D3                 2.3
    Vitamin D   Vitamin D 1000     2.4
    Vitamin D   Vitamin D 10000    2.5
    Vitamin D   Vitamin D 20000    2.6
    Vitamin K2  Vitamin K2         3
    Vitamin K2  Vitamin K          3.1
    Vitamin K2  Vitamin K2 Mk7     3.2
    Vitamin C   Vitamin C          4

考虑下表模式:

create table vitamins (
  id serial primary key,
  parent_id integer,
  name varchar(64),
  index smallint
);
使用以下数据:

insert into vitamins (id, parent_id, name, index) values
  (1, null, 'Vitamine', 1),
  (2, null, 'Vitamin D', 2),
  (3, 2, 'Vitamin D3', 1),
  (4, 2, 'Vitamin D K2', 2),
  (5, 2, 'D3', 3),
  (6, 2, 'Vitamin D 1000', 4),
  (7, 2, 'Vitamin D 10000', 5),
  (8, 2, 'Vitamin D 20000', 6),
  (9, null, 'Vitamin K2', 3),
  (10, 9, 'Vitamin K', 1),
  (11, 9, 'Vitamin K2 Mk7', 2),
  (12, null, 'Vitamin C', 4)
;
我们可以通过以下查询获得您想要的预期输出:

WITH RECURSIVE recursive_vitamins(id, parent_id, index, parent_name, name, ref, sort) AS (
    SELECT c.id, c.parent_id, c.index, c.name, c.name, c.index::text, lpad(c.index::text, 3, '0')
    FROM vitamins c
    WHERE parent_id is null
    UNION ALL
    SELECT c.id, c.parent_id, c.index, rc.parent_name, c.name,
           CASE WHEN rc.ref = '' THEN c.index::text
                ELSE (rc.ref || '.' || c.index)
               END, (rc.sort || '.' || lpad(c.index::text, 3, '0'))
    FROM vitamins c, recursive_vitamins rc
    WHERE c.parent_id = rc.id
)

SELECT
    parent_name AS parent,
    name AS child,
    ref AS sort_order
FROM recursive_vitamins
ORDER BY sort;
结果:

parent      child         sort_order
Vitamine    Vitamine      1
Vitamin D   Vitamin D     2
Vitamin D   Vitamin D3    2.1
Vitamin D   Vitamin D K2  2.2
Vitamin D   D3            2.3
...

等等,这里发生了什么事?

因此,我们创建了一个允许查询引用自己的输出的函数。 在
WITH
查询中,我们首先选择所有父项(
父项id为null
),然后选择引用
父项id的所有子项

ref
字段是父索引和子索引的串联。
排序
字段也引用了
索引
,但它将
索引
0
的总长度设置为3。您可以忽略此项,只需按ref
排序,但如果您有一个
索引
=
10
,则顺序将变为
1,10,10.1,2
,我想您可能不希望这样