Ich habe http://explainextended.com/2009/03 studiert /17/hierarchische-abfragen-in-mysql/ und eine Lösung für dein Problem gefunden. Ich denke, Sie haben bereits Ihre Lösung, aber für alle anderen, die nach derselben Lösung suchen, antworte ich hier.
Meine Lösung funktioniert auch für relationale Tabellen, da wir im übergeordneten Feld in der relationalen Tabelle keine Null (0) setzen können. Es wird NULL sein und meine Lösung funktioniert auch perfekt für relationale Tabellen.
Die Funktion
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 ;
Bitte ersetzen Sie yourTable
mit Ihrem Tabellennamen und yourField
mit Ihrem Feldnamen, nach dem Sie Ihre Daten sortieren möchten.
Die Abfrage
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
Bitte ersetzen Sie yourTable
mit Ihrem Tabellennamen und yourField
mit Ihrem Feldnamen, den Sie anzeigen möchten.
Dadurch erhalten Sie das gewünschte Ergebnis. Ich habe es getestet und es funktioniert gut.
Hier ist http://sqlfiddle.com/#!9/9d060d/2 um es in Aktion zu sehen.