繁体   English   中英

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

[英]MySQL - Getting the top-level parent id in a hierarchy

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

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

我获取某个position_idparent_position_id的查询是:

select `parent_position_id` from `position_hierarchy_level` where position_id= 15;

但是如何才能获得某个position_id的最顶级父级? 例如, position_id 15的最顶层parent_position_id将为1

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

除非有15个或更多连接,否则您的数据库结构不允许您这样做。 您正在使用邻接列表模型 尝试使用嵌套集模型

这是php的一个例子

看起来像同样的问题: 用于邻接列表显示的递归PHP函数

使用mysql的单个查询可能有点不同。 也许你可以用存储过程解决这个问题。

如果我理解正确,你想要最高position_id为parent_position_id有1等等...

1。 将parent_position_id设置为自动递增

2。 通过position_id desc从表顺序中选择position_id并将它们放在一个数组中

3。 截断表

4。 将数组插入表中

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

我想不,请看这里的MySQL中的分层查询

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

我想是的。

尝试这个:

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 );

显然, 你并不是唯一一个研究过那种解决方案的人:)

使用这个表结构,你拥有的最佳选择是在php结束时循环。

如果表结构是你可以自由的改变(在情况下,如果项目是不是已经生活 ),你可能要考虑结构称为Closure Tables 你可以找到的是如何使用/设置在一个简单的例子, 这篇文章

无论如何,您应该能够在SQL Antipatterns一书中找到更多有关该主题的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM