这是我的表格结构......
表: position_hierarchy_level
id parent_position_id position_id
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
6 6 7
7 7 8
8 8 9
9 9 10
10 10 11
11 11 12
12 12 13
13 13 14
14 14 15
我获取某个parent_position_id
的{{1}}的查询是:
position_id
但是,如何才能获得某个select `parent_position_id` from `position_hierarchy_level` where position_id= 15;
的最顶级父级?例如,position_id
15的最顶层parent_position_id
为position_id
。
有没有一种方便的方法来使用单个查询获取此值?或者我需要在PHP中创建一个循环吗?
答案 0 :(得分:4)
除非有15个或更多联接,否则您的数据库结构不允许您这样做。您正在使用邻接列表模型。尝试使用The nested set model
这是an example与php
答案 1 :(得分:1)
看起来像是同一个问题: Recursive PHP function for adjacency-list display
使用mysql的单个查询可能有点不同。也许你可以通过存储过程解决这个问题。
答案 2 :(得分:1)
如果我理解正确并且你想要最高position_id为parent_position_id有1等等......
1。将parent_position_id设置为自动递增
2。通过position_id desc从表顺序中选择position_id并将它们放入数组
3。截断表
4。将数组插入表
答案 3 :(得分:1)
答案 4 :(得分:1)
试试这个:
DELIMITER $$
CREATE FUNCTION getTopParentPositionId(positionId INT) RETURNS INT DETERMINISTIC
BEGIN
DECLARE x INT;
DECLARE y INT;
SET x = positionId;
sloop:LOOP
SET y = NULL;
SELECT parent_position_id INTO y FROM position_hierarchy_level WHERE position_id = x;
IF y IS NULL THEN
LEAVE sloop;
END IF;
SET x = y;
ITERATE sloop;
END LOOP;
RETURN x;
END $$
DELIMITER ;
然后:
SELECT getTopParentPositionId( 5 );
显然,you are not the only one调查了那种解决方案:)
答案 5 :(得分:1)
使用这个表结构,你拥有的最佳选择是在php结束时循环。
如果表结构是可以自由更改的(如果项目不是实时),您可能需要查看名为Closure Tables
的结构。您可以在this article中找到有关如何使用/设置的简单示例。
无论如何,您应该能够在SQL Antipatterns一书中找到更多有关该主题的内容。