按给定ID

时间:2016-11-11 05:59:49

标签: php mysql recursion

我有一张桌子'表'具有以下结构

   ID   LinkedWith
    12     13
    13     12
    14     13
    15     14
    16      0
    17      0
    18     21

我们会给出一个ID" 12" (或者可能是15),有了它,我们必须获取所有其他相关的ID。

这里12链接到13,14链接到13,15连接到14,依此类推。在我们的例子中,有4个间接相关的ID,可能有很多。 例如,在上述情况下,我们需要IDS 12,13,14,15的最终结果。

我有这个不完整的功能,但无法进一步思考。我知道我们可能需要递归函数但不知道该怎么做

function testFetchRelated($id){
        $arrayIDs = array($id);


        try{
            $dbh = new PDOConfig("db_test");
            $stmt = $dbh->prepare("SELECT * FROM table WHERE ID='".$id."' OR LinkedWith='".$id."'");
            $stmt->execute();

            if($stmt->rowCount()>0){
                $fetch = $stmt->fetchAll(PDO::FETCH_OBJ);

                foreach($fetch as $f){
                    if($f->LinkedWith>0){
                        array_push($arrayIDs, $f->LinkedWith);
                    }

                    if($f->ID!=$id){
                        array_push($arrayIDs, $f->ID);
                    }
                }
            }else{

            }

            $stmt = null;
            $dbh = null;

            return $arrayIDs;
        }catch(PDOException $e){
            echo "AN ERROR OCCURRED: ".$e->getMessage();
        }

任何人都可以帮我这个

1 个答案:

答案 0 :(得分:1)

我已经敲了这个似乎在MySQL程序中做你想要的东西: -

DELIMITER ;;

DROP PROCEDURE IF EXISTS `find_relations`;;
CREATE PROCEDURE `find_relations`(IN_id INT)
BEGIN

    CREATE TABLE ids_tmp 
    (
        ID  INT(11),
        PRIMARY KEY (ID)
    );

    INSERT INTO ids_tmp
    SELECT a.ID FROM some_table a WHERE a.LinkedWith = IN_id
    UNION 
    SELECT a.LinkedWith FROM some_table a WHERE a.ID = IN_id
    UNION 
    SELECT a.LinkedWith FROM some_table a WHERE a.LinkedWith = IN_id
    UNION 
    SELECT a.ID FROM some_table a WHERE a.ID = IN_id;

    WHILE (ROW_COUNT() > 0) DO
        INSERT INTO ids_tmp
        SELECT a.ID FROM some_table a 
        INNER JOIN ids_tmp b ON a.LinkedWith = b.ID 
        LEFT OUTER JOIN ids_tmp c ON a.ID = c.ID 
        WHERE c.ID IS NULL
        UNION 
        SELECT a.ID FROM some_table a 
        INNER JOIN ids_tmp b ON a.ID = b.ID 
        LEFT OUTER JOIN ids_tmp c ON a.LinkedWith = c.ID 
        WHERE c.ID IS NULL;
    END WHILE;

    SELECT ID FROM ids_tmp;

    DROP TABLE IF EXISTS ids_tmp;

END;;

DELIMITER ;

您可以使用 CALL find_relations(12);

调用它

未完全调试它(最好使用临时表,但它依赖于在各种单个查询中多次访问同一个表,MySQL不支持临时表),但希望能给你一些想法

如果您想实际使用它,那么可能需要确保创建的表具有会话唯一的名称。