J'ai étudié http://explainextended.com/2009/03 /17/requêtes-hiérarchiques-dans-mysql/ et trouvé une solution à votre problème. Je suppose que vous avez déjà votre solution, mais pour tous ceux qui recherchent la même solution, je réponds ici.
Ma solution fonctionnera également pour les tables relationnelles car nous ne pouvons pas définir zéro (0) dans le champ parent de la table relationnelle. Ce sera NULL et ma solution fonctionne parfaitement pour les tables relationnelles également.
La fonction
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 ;
Veuillez remplacer yourTable
avec le nom de votre table et yourField
avec votre nom de champ par lequel vous souhaitez trier vos données.
La requête
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
Veuillez remplacer yourTable
avec le nom de votre table et yourField
avec votre nom de champ que vous souhaitez afficher.
Cela produira le résultat que vous avez demandé. Je l'ai testé et fonctionne bien.
Voici http://sqlfiddle.com/#!9/9d060d/2 pour le voir en action.