2016-02-13 74 views
0

发现所有的父母都在我的MySQL数据库中,我有这样的结构,一个表称为单位:级联选择,直到表

ID, Name, parentUnitID, UnitTypeID, ... 

是否有可能产生一个完整的单元链有一个查询和一个ID作为起点?只要给定ID有更多父母,就可以级联查询?如果没有深度限制,我无法找到一种方法。

有可能给定的ID有一个父母本身也有一个父母,也可能有一个,等等。

编辑:

我期待的结果是这样的:

IDDepth1, IDDepth2, IDDepth3, ..., NameDepth1, NameDepth2, NameDepth3, ... 

或者

UnitTypeID1, Name1, 
UnitTypeID2, Name2, 
UnitTypeID3, Name3, 
... 

要获得完整的单元链为给定的ID和解析它在PHP来构建一个级联数组。

EDIT2:

我想是这样的

SELECT ID, Name 
FROM Units as u1 
WHERE UnitTypeID = "4" 
AND EXISTS (
    SELECT ID, Name 
    FROM Units as u2 
    WHERE UnitTypeID = "5" 
    AND u2.ParentUnitID = u1.ID 
    AND EXISTS (
     SELECT ID 
     FROM Units as u3 
     WHERE ID = "1692820" 
     AND u3.UnitTypeID = "6" 
     AND u3.ParentUnitID = u2.ID 
    ) 
); 

但首先它是静态的,第二从EXISTS不是选择本身的一部分结果。

+0

父母怎么可以有多个父。你如何储存? –

+0

由多位家长指我的父母可以有父母,可以有父母,可以有父母等。单元7以单元6为父母,6以5为父母,5以4为父母。但我不知道一个单元总共有多少个父母。 – Thomson

+0

您的问题与我提到的问题重复。只是适应你的问题。 –

回答

0

你可以通过编写一个存储过程来实现这个功能,这个存储过程会把父母的ID插入到一个临时表中并通过父母循环等等。

我写了下面的程序作为一个简单的例子;这当然不是完美的,但可能是一个开端

DELIMITER $$ 

drop procedure if exists get_unitschain$$ 

CREATE PROCEDURE get_unitschain (IN childUnitID INTEGER) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tmp_chain; -- Will contain the parents ID's 
    DROP TEMPORARY TABLE IF EXISTS tmp_processed; -- Copy of tmp_chain 
    DROP TEMPORARY TABLE IF EXISTS tmp_parents; -- New parents identified by each WHILE loop 

    CREATE TEMPORARY TABLE tmp_chain (
     ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     UnitID INTEGER NOT NULL 
    ); 

    CREATE TEMPORARY TABLE tmp_processed (
     UnitID INTEGER NOT NULL 
    ); 

    CREATE TEMPORARY TABLE tmp_parents (
     UnitID INTEGER NOT NULL 
    ); 

    INSERT INTO tmp_chain (UnitID) VALUES (childUnitId); 
    INSERT INTO tmp_parents (UnitID) VALUES (childUnitId); -- To start the WHILE loop 

    WHILE (SELECT COUNT(*) FROM tmp_parents) DO 
     DELETE FROM tmp_parents; 

     INSERT INTO tmp_parents (UnitID) 
      SELECT units.parentUnitID 
       FROM tmp_chain 
        INNER JOIN units ON units.ID = tmp_chain.UnitId 
       WHERE units.parentUnitID NOT IN (SELECT tmp_processed.UnitId FROM tmp_processed); 

     INSERT INTO tmp_chain (UnitID) SELECT tmp_parents.UnitID FROM tmp_parents; 
     INSERT INTO tmp_processed (UnitID) SELECT tmp_parents.UnitID FROM tmp_parents; 
    END WHILE; 

    SELECT units.UnitTypeID, units.Name FROM tmp_chain INNER JOIN units ON units.ID = tmp_chain.UnitID; 

    DROP TEMPORARY TABLE tmp_chain; 
    DROP TEMPORARY TABLE tmp_processed; 
    DROP TEMPORARY TABLE tmp_parents; 
END$$ 

要使用的程序:

CALL get_unitschain([child id]);