4

这是我的表结构...

表: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我的查询position_id是:

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

但是我怎样才能得到某个的最高父级position_id呢?例如,15 个中最靠前的parent_position_idposition_id1.

有没有一种方便的方法可以使用单个查询来获取这个值?还是我需要在 PHP 中创建一个循环?

4

6 回答 6

4

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

这是一个使用 php的示例

于 2012-04-17T07:59:01.493 回答
2

试试这个:

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

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

于 2012-04-17T08:00:07.857 回答
1

看起来同样的问题: Recursive PHP function for adjacency-list display

对 mysql 使用单个查询可能会有所不同。也许你可以用一个存储过程来解决这个问题。

于 2012-04-17T07:41:25.087 回答
1

如果我理解正确并且您希望最高 position_id 为 parent_position_id 1 等等...

1. 将 parent_position_id 设置为自动递增

2. 按 position_id desc 从 table order 中选择 position_id 并将它们放入数组中

3. 截断表

4. 将数组插入表

于 2012-04-17T07:52:24.473 回答
1

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

我认为不,请在此处查看 MySQL 中的分层查询

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

我想是的。

于 2012-04-17T07:58:10.213 回答
1

使用此表结构,您拥有的最佳选择是 php 结束时的循环。

如果表结构是您可以自由更改的(以防项目尚未生效),您可能需要查看名为Closure Tables. 您可以在本文中找到如何使用/设置的简单示例。

无论如何,您应该能够在SQL Antipatterns书中找到更多关于该主题的信息。

于 2012-04-17T08:03:57.137 回答