Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jaki jest najprostszy sposób uzyskania wszystkich rodziców rekordu przy użyciu modelu id / parent_id w mysql/php?

Można to zrobić w MySQL , ale musisz utworzyć funkcję i użyć w zapytaniu.

Zobacz ten wpis na moim blogu, aby uzyskać szczegółowe wyjaśnienia:

Oto funkcja i zapytanie:

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

To ostatnie zapytanie wybierze wszystkich potomków danego węzła (które należy ustawić w @start_with zmienna)

Aby znaleźć wszystkich przodków danego węzła, możesz użyć prostego zapytania bez funkcji:

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

W tym artykule na moim blogu opisano to zapytanie bardziej szczegółowo:

Aby oba te rozwiązania działały w rozsądnym czasie, musisz mieć indeksy na obu id i rodzic .

Upewnij się, że Twój id jest zdefiniowany jako KLUCZ PODSTAWOWY i masz dodatkowy indeks na rodzicu .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy WSTAWIAM wiele wierszy do tabeli MySQL, czy identyfikatory będą za każdym razem zwiększane o 1?

  2. Rzutowanie MySQL wartości -1 zwraca 18446744073709551615

  3. Wykonywanie instrukcji INSERT ... SELECT atomic

  4. Co to są zasoby nr?

  5. Formatowanie DateTime w .Net dla bazy danych MySQL