我使用以下列运行了mill嵌套集层次结构类型设置:
表名:
myset
列:
id, name, lft, rgt
是否有人知道查询以确定节点的父?
我读了几个地方,在你的表中也有一个 parent_id 列来跟踪这一点很方便,但它似乎是多余的,似乎它可能与嵌套不同步设置在添加/删除/移动集合中的任何内容时是否错误地执行了查询。
答案 0 :(得分:19)
看看this question。它与你的相似。我已在那里发布了您可能需要的查询。
SELECT title, (SELECT TOP 1 title
FROM tree t2
WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt
ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC
我希望有你需要的东西。
对于下表:
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
它产生输出:
title | parent
----------------------------------------------
ELECTRONICS | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS | ELECTRONICS
MP3 PLAYERS | PORTABLE ELECTRONICS
FLASH | MP3 PLAYERS
CD PLAYERS | PORTABLE ELECTRONICS
2 WAY RADIOS | PORTABLE ELECTRONICS
TUBE | TELEVISIONS
LCD | TELEVISIONS
PLASMA | TELEVISIONS
答案 1 :(得分:16)
TOP是一个MSSQL命令,使用LIMIT for MySQL:
SELECT title, (SELECT title
FROM tree t2
WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt
ORDER BY t2.rgt-t1.rgt ASC
LIMIT 1)
AS parent FROM tree t1
ORDER BY (rgt-lft) DESC
应该做的伎俩..
答案 2 :(得分:3)
只是为了增加这些帮助我的答案,
我需要找到一个节点的直接父节点,以及在某些情况下节点链的顶级父节点,
我使用以下作为基础来获取子到父顺序的项目
SELECT parent.* FROM
nested_set node,
nested_set parent
WHERE (
node.set_left BETWEEN parent.set_left AND parent.set_right
)
AND node.set_id={CHILD_NODE_ID_HERE}
ORDER BY parent.set_right - parent.set_left
#LIMIT 1,1
然后将LIMIT 1,1
添加到仅捕获将成为直接父级的第二行
还应该注意的是,通过上述查询,如果节点本身是最高级别的父级,那么它就不会有直接父级,所以使用LIMIT 1,1
它应该返回一个空结果集
获取最高级别的父级我颠倒了order by子句,包括检查节点本身是否为顶级父级,并将结果限制为第一行
SELECT parent.* AS top_level_right FROM
nested_set node,
nested_set parent
WHERE (
node.set_left >= parent.set_left
AND node.set_left <= parent.set_right
)
AND node.set_id={CHILD_NODE_ID_HERE}
ORDER BY parent.set_left - parent.set_right
LIMIT 1
在上一个查询中我使用了>= <=
运算符,以便所选范围包含子节点,如果它也恰好是顶级父节点
答案 3 :(得分:2)
我对Lucasz的查询有疑问。我的mysql版本不懂TOP命令。我不得不使用LIMIT。这是修改后的代码。
SELECT
`id`,
(SELECT
`id`
FROM
`[*** YOUR TABLE ***]` AS `t2`
WHERE
`t2`.`left_id` < `t1`.`left_id`AND
`t2`.`right_id` > `t1`.`right_id`
ORDER BY
`t2`.`right_id`-`t1`.`right_id`ASC
LIMIT
1) AS `parent`
FROM
`[*** YOUR TABLE ***]` AS `t1`
WHERE
`t1`.`id` = [*** ID OF THE NODE WHOS PARENT YOU WISH TO LOOKUP ***]
ORDER BY
`right_id`-`left_id` DESC
显然,改变[]中的内容以满足您的需求。同时删除[]的。此查询仅返回一行。像这样......
id parent
7 3
答案 4 :(得分:1)
select * from myset
where lft < :lftOfCurrent and rgt > :lftOfCurrent
order lft desc
limit 1
您可以使用max而不是order / limit,并且可能需要另一个关键字将结果限制为一行,具体取决于您的数据库。之间而不是&lt;和&gt;如果您的数据库返回独占集合,MySQL将不会这样做。
答案 5 :(得分:1)
SELECT parent.name
FROM myset AS node, myset AS parent
WHERE parent.lft < node.lft
AND parent.rgt > node.rgt
AND node.id = {YOUR CATEGORY ID}
ORDER BY ( parent.rgt - parent.lft ) ASC LIMIT 1;
答案 6 :(得分:0)
返回所有祖先
SELECT id FROM thetable
WHERE x BETWEEN lft and rgt;
因此,直接父母是lft和rgt之间差异最小的祖先。
SELECT id FROM thetable
WHERE x BETWEEN lft and rgt
ORDER BY (rgt-lft)
LIMIT 1
答案 7 :(得分:0)
来自spankmaster79的代码并非完全错误。我修改了他的代码并且工作正常。
SELECT parent . * FROM Nested_Category AS node, Nested_Category AS parent
enter code hereWHERE node.leftSide
BETWEEN parent.leftSide
AND parent.rightSide
AND node.id ='Enter the Node ID'
ORDER BY (
parent.rightSide - parent.leftSide
)
LIMIT 1 , 1