sql >> データベース >  >> RDS >> Mysql

mysql/phpのid/parent_idモデルを使用してレコードのすべての親を取得する最も簡単な方法は何ですか?

    MySQLでそれを行うことが可能です 、ただし、関数を作成してクエリで使用する必要があります。

    詳細な説明については、私のブログのこのエントリを参照してください:

    関数とクエリは次のとおりです。

    CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
    NOT DETERMINISTIC
    READS SQL DATA
    BEGIN
            DECLARE _id INT;
            DECLARE _parent INT;
            DECLARE _next INT;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;
    
            SET _parent = @id;
            SET _id = -1;
    
            IF @id IS NULL THEN
                    RETURN NULL;
            END IF;
    
            LOOP
                    SELECT  MIN(id)
                    INTO    @id
                    FROM    place
                    WHERE   parent = _parent
                            AND id > _id;
                    IF @id IS NOT NULL OR _parent = @start_with THEN
                            SET @level = @level + 1;
                            RETURN @id;
                    END IF;
                    SET @level := @level - 1;
                    SELECT  id, parent
                    INTO    _id, _parent
                    FROM    place
                    WHERE   id = _parent;
            END LOOP;
    END
    
    SELECT  id, parent
    FROM    (
            SELECT  hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
            FROM    (
                    SELECT  @start_with := 0,
                            @id := @start_with,
                            @level := 0
                    ) vars, t_hierarchy
            WHERE   @id IS NOT NULL
            ) ho
    JOIN    place hi
    ON      hi.id = ho.id
    

    後者のクエリは、特定のノードのすべての子孫を選択します(@start_withで設定する必要があります) 変数)

    特定のノードのすべての祖先を検索するには、関数を使用しない単純なクエリを使用できます。

    SELECT  @r AS _id,
            @r := (
            SELECT  parent
            FROM    place
            WHERE   id = _id
            ) AS parent
    FROM    (
            SELECT  @r := @node_id
            ) vars,
            place
    

    私のブログのこの記事では、このクエリについて詳しく説明しています。

    これらの両方のソリューションが妥当な時間で機能するには、両方のidにインデックスが必要です。 およびparent

    idを確認してください PRIMARY KEYとして定義されています parentにsecondayインデックスがあります 。



    1. SQLServerで数値を小数点以下2桁にフォーマットする4つの関数

    2. MySQLの1対多の関係-モデルを構築する方法は?

    3. PHPおよびMySQLでHTMLフォーム挿入が機能しない

    4. MySQLのNOW()、SYSDATE()、およびCURRENT_DATE()の違い