Mysql
 sql >> база данни >  >> RDS >> Mysql

Кой е най-простият начин да получите всички родители на запис, използвайки модела id/parent_id в mysql/php?

Възможно е да го направите в 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 и родител .

Уверете се, че вашият id се дефинира като ПЪРВИЧЕН КЛЮЧ и имате втори индекс на родител .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Замяна на \r\n (знаци за нов ред) след изпълнение на json_encode

  2. SQL - Намерете всички времена на прекъсване и дължините на престой от MySQL данни (набор от редове с времеви печати и съобщения за състоянието)

  3. MySQL - BETWEEN няма да избере правилни резултати

  4. Laravel eloquent получава най-често срещаната стойност в колона на база данни

  5. Функцията isset() връща true, дори когато елементът не е зададен