Jag har studerat http://explainextended.com/2009/03 /17/hierarchical-queries-in-mysql/ och hittade en lösning på ditt problem. Jag antar att du redan har din lösning men för alla andra som söker efter samma lösning svarar jag här.
Min lösning kommer att fungera för relationstabeller också eftersom vi inte kan sätta noll (0) i det överordnade fältet i relationstabellen. Det kommer att vara NULL och min lösning fungerar också perfekt för relationstabeller.
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 ;
Byt ut yourTable
med ditt tabellnamn och yourField
med ditt fältnamn som du vill sortera dina data efter.
Frågan
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
Byt ut yourTable
med ditt tabellnamn och yourField
med ditt fältnamn som du vill visa.
Detta kommer att producera resultatet som du behövde. Jag testade det och fungerar bra.
Här är http://sqlfiddle.com/#!9/9d060d/2 för att se det i aktion.