2012-04-17 202 views
4

这里是我的表结构...MySQL的 - 获取顶级父ID在一个层次

表: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的最顶端的父母?例如,最上面的parent_position_idposition_id 15将是1

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

+0

我看不到有'id = 15'的任何一行 – hjpotter92 2012-04-17 07:39:59

+2

他的意思是'position_id = 15'。 – BluesRockAddict 2012-04-17 07:40:25

+0

是的,它的position_id = 15 – rjmcb 2012-04-17 07:42:47

回答

4

你的数据库结构不会让你这样做,除非有15个或更多的连接。您正在使用邻接列表模型。尝试使用The nested set model

这里是an example用php

1

貌似同样的问题: Recursive PHP function for adjacency-list display

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

+0

我只需要最上面的父母 – rjmcb 2012-04-17 07:43:45

+0

select_id,parent_position_id,position_id从position_hierarchy_level其中parent_position_id = min(parent_position_id) - 或我不明白问题? – Broncko 2012-04-17 07:48:49

+0

更好:从position_hierarchy_level中选择id,position_id order by parent_position_id limit 1 – Broncko 2012-04-17 07:51:12

1

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

1。 SET parent_position_id自动增量

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

3。截断表

4。插入数组到表

1

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

我觉得没什么,拿来看here的层次化查询在MySQL

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

我认为是的。

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谁看着thoose一种解决方案:)

1

有了这个t有能力的结构你拥有的最好的选择是在PHP结束事物循环。

如果表格结构是可以自由更改的东西(如果项目不是已经),您可能需要查看名为Closure Tables的结构。您可以在this article中找到如何使用/设置的简单示例。

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

相关问题