鉴于以下表格:
CREATE TABLE tree (
id serial NOT NULL,
name character varying NOT NULL,
type integer,
lft integer NOT NULL,
rgt integer NOT NULL )
CREATE TABLE item (
id serial NOT NULL,
name character varying NOT NULL,
tree_id integer
CONSTRAINT fk_tree FOREIGN KEY (tree_id) REFERENCES tree (id) )
使用修改后的预订树遍历(MPTT)算法填充表lft
上的列rgt
和tree
。
是否可以将所有项目附加到type = x的树节点以及所有后代都在单个查询中?
通常情况下,我会在两个单独的查询中执行此操作:
SELECT lft, rgt FROM tree WHERE type = x;
/* assume it returns two rows: ((10, 20), (27, 30)) */
SELECT item.id, item.name FROM item JOIN tree ON (tree_id = tree.id)
WHERE ((lft >= 10 AND rgt <= 20) OR (lft >= 27 AND rgt <= 30);
关键是我只能执行一个SQL语句(如果重要的话,在PostgreSQL数据库中)。你能用某种子查询做到这一点吗?
感谢任何提示。
答案 0 :(得分:2)
SELECT item.*
FROM tree tm
JOIN tree tc
ON tc.lft >= tm.lft
AND tc.rgt <= tm.rgt
JOIN item
ON item.tree_id = tc.id
WHERE tm.type = x
您可能需要考虑更容易管理的父子模型。
请参阅我的博客中有关如何在PostgreSQL 8.3
及以下版本中实施该文章的文章:
,并在PostgreSQL 8.4
:
答案 1 :(得分:0)
那么,如果您在将查询写入给定数据结构时遇到问题,或许您应该考虑使用其他一些数据结构?嵌套集(你在这里展示的内容)看起来很酷,但在向它们编写查询时是一个很大的痛苦。
也许您可以使用this之类的内容(披露:这是我博客上的帖子)。