我有一个看起来像这样的表:
stuff
id integer
content text
score double
children[] (an array of id's from this same table)
我想运行一个查询,选择给定ID的所有子项,然后立即获取所有这些子项的完整行,按分数排序。
有关最佳方法的任何建议吗?我已经研究过RECURSIVE,但我不确定它是否可行。尝试在postgresql SE发帖但没有运气。
答案 0 :(得分:3)
以下查询将查找与id
14:
SELECT *
FROM unnest((SELECT children FROM stuff WHERE id=14)) t(id)
JOIN stuff USING (id)
ORDER BY score;
这可以通过首先找到14的子节点作为数组,然后使用unnest
函数将其转换为表格,然后我们与stuff
一起查找具有给定{{1}的所有行1}} S上。
答案 1 :(得分:1)
连接条件中的ANY
构造最简单:
SELECT c.*
FROM stuff p
JOIN stuff c ON id = ANY (p.children)
WHERE p.id = 14
ORDER BY c.score;
对于查询,子ID数组是在同一个表中还是在不同的表中无关紧要。你只需要这里的表别名是明确的。
相关:
答案 2 :(得分:0)
类似的解决方案:
使用Postgres,您可以使用递归公用表表达式:
with recursive rel_tree as ( select rel_id, rel_name, rel_parent, 1 as level, array[rel_id] as path_info from relations where rel_parent is null union all select c.rel_id, rpad(' ', p.level * 2) || c.rel_name, c.rel_parent, p.level + 1, p.path_info||c.rel_id from relations c join rel_tree p on c.rel_parent = p.rel_id ) select rel_id, rel_name from rel_tree order by path_info;
参考:Postgresql query for getting n-level parent-child relation stored in a single table