MySQL - 获取层次结构中的顶级父ID

时间:2012-04-17 07:37:06

标签: php mysql database

这是我的表格结构......

表: 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_idposition_id

有没有一种方便的方法来使用单个查询获取此值?或者我需要在PHP中创建一个循环吗?

6 个答案:

答案 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)

  

有没有一种方便的方法来使用单个查询来获取它?

我认为不,请查看here查看MySQL中的分层查询

  

我需要在PHP中创建一个循环语句吗?

我认为是。

答案 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一书中找到更多有关该主题的内容。