Ik heb http://explainextended.com/2009/03 bestudeerd /17/hierarchical-queries-in-mysql/ en een oplossing voor uw probleem gevonden. Ik neem aan dat je je oplossing al hebt, maar voor iedereen die op zoek is naar dezelfde oplossing, beantwoord ik hier.
Mijn oplossing werkt ook voor relationele tabellen, omdat we geen nul (0) kunnen instellen in het bovenliggende veld in de relationele tabel. Het zal NULL zijn en mijn oplossing werkt ook perfect voor relationele tabellen.
De Functie
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 ;
Vervang a.u.b. yourTable
met je tabelnaam en yourField
met uw veldnaam waarop u uw gegevens wilt sorteren.
De Query
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
Vervang a.u.b. yourTable
met je tabelnaam en yourField
met uw veldnaam die u wilt weergeven.
Dit levert het gewenste resultaat op. Ik heb het getest en het werkt goed.
Hier is http://sqlfiddle.com/#!9/9d060d/2 om het in actie te zien.