Ho studiato http://explainextended.com/2009/03 /17/query-gerarchiche-in-mysql/ e ho trovato una soluzione al tuo problema. Immagino che tu abbia già la tua soluzione, ma per qualsiasi altro che stia cercando la stessa soluzione rispondo qui.
La mia soluzione funzionerà anche per le tabelle relazionali poiché non possiamo impostare zero (0) nel campo padre nella tabella relazionale. Sarà NULL e la mia soluzione funziona perfettamente anche per le tabelle relazionali.
La funzione
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 ;
Sostituisci yourTable
con il nome della tua tabella e yourField
con il nome del tuo campo in base al quale desideri ordinare i tuoi dati.
La 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
Sostituisci yourTable
con il nome della tua tabella e yourField
con il nome del campo che desideri visualizzare.
Questo produrrà il risultato come richiesto. L'ho testato e funziona bene.
Ecco http://sqlfiddle.com/#!9/9d060d/2 per vederlo in azione.