具有查询可以完成这项工作。需要 Postgresql 或更高版本:
WITH RECURSIVE next_in_line AS (
SELECT u.id AS unit_id, u.parent_id, a.unit_id AS acl
FROM unit u
LEFT JOIN acl a ON a.unit_id = u.id
UNION ALL
SELECT n.unit_id, u.parent_id, a.unit_id
FROM next_in_line n
JOIN unit u ON u.id = n.parent_id AND n.acl IS NULL
LEFT JOIN acl a ON a.unit_id = u.id
)
SELECT unit_id, acl
FROM next_in_line
WHERE acl IS NOT NULL
ORDER BY unit_id
第二回合的休息条件UNION
是n.acl IS NULL
。这样,一旦acl
找到,查询就会停止遍历树。 最后,SELECT
我们只返回acl
找到an 的行。瞧。
顺便说一句:使用通用的、非描述性的id
作为列名是一种反模式。可悲的是,一些 ORM 默认情况下会这样做。调用它unit_id
,您不必一直在查询中使用别名。