sql >> Database teknologi >  >> RDS >> Mysql

Mysql sortering Hierarkiske data

Jeg har studeret http://explainextended.com/2009/03 /17/hierarchical-queries-in-mysql/ og fundet en løsning på dit problem. Jeg gætter på, at du allerede har din løsning, men for enhver anden, der søger efter samme løsning, svarer jeg her.

Min løsning vil også fungere for relationelle tabeller, da vi ikke kan sætte nul (0) i overordnet felt i relationstabellen. Det bliver NULL, og min løsning fungerer også perfekt til relationelle tabeller.

Funktionen

DROP FUNCTION IF EXISTS hierarchy_connect_by_parent_eq_prior_id;
DELIMITER $$
CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INTEGER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE _parent INT;
    DECLARE _rank INT;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

    SET _parent = @id;
    SET _rank = 0;

    IF @id IS NULL THEN
            RETURN NULL;
    END IF;

    LOOP
        SET @innerrank = 0;
        SELECT p.id 
        INTO   @id
        FROM   (
                SELECT   id, @innerrank := @innerrank+1 AS rank 
                FROM     yourTable 
                WHERE    COALESCE(parent, 0) = _parent 
                ORDER BY yourField
                ) p 
        WHERE   p.rank > _rank LIMIT 0, 1;
        IF @id IS NOT NULL OR _parent = @start_with THEN
                SET @level = @level + 1;
                RETURN @id;
        END IF;
        SET @level := @level - 1;
        SET @innerrank = 0;
        SELECT COALESCE(p.parent, 0), p.rank
        INTO   _parent, _rank
        FROM   (
                SELECT id, parent, @innerrank := @innerrank+1 AS rank
                FROM    yourTable
                WHERE   COALESCE(parent, 0) = (
                    SELECT COALESCE(parent, 0) FROM yourTable WHERE id = _parent
                    ) 
                ORDER BY yourField
               ) p
        WHERE p.id = _parent;
    END LOOP;       
END;
$$
DELIMITER ;

Erstat venligst yourTable med dit tabelnavn og yourField med dit feltnavn, som du vil sortere dine data efter.

Forespørgslen

SELECT ou.* FROM (
    SELECT hi.id, parent, yourField 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, yourTable 
            WHERE @id IS NOT NULL
        ) ho 
    JOIN yourTable hi ON hi.id = ho.id
) ou

Erstat venligst yourTable med dit tabelnavn og yourField med dit feltnavn, som du vil have vist.

Dette vil producere det resultat, som du har brug for. Jeg testede det og fungerer godt.

Her er http://sqlfiddle.com/#!9/9d060d/2 for at se det i aktion.



  1. Sådan finder du EBS R12 komponenter Version

  2. Årsager til MySQL-fejl 2014 Kan ikke udføre forespørgsler, mens andre ubuffrede forespørgsler er aktive

  3. Dynamisk udfyldt rullemenu; $_POST returnerer fejl

  4. Undgå at gentage poster, der vises i MySQL / PHP