Upravit
Řešení zmíněné @leftclickben je také efektivní. Můžeme pro to použít i uloženou proceduru.
CREATE PROCEDURE get_tree(IN id int)
BEGIN
DECLARE child_id int;
DECLARE prev_id int;
SET prev_id = id;
SET child_id=0;
SELECT col3 into child_id
FROM table1 WHERE col1=id ;
create TEMPORARY table IF NOT EXISTS temp_table as (select * from table1 where 1=0);
truncate table temp_table;
WHILE child_id <> 0 DO
insert into temp_table select * from table1 WHERE col1=prev_id;
SET prev_id = child_id;
SET child_id=0;
SELECT col3 into child_id
FROM TABLE1 WHERE col1=prev_id;
END WHILE;
select * from temp_table;
END //
K ukládání výsledků výstupu používáme dočasnou tabulku, a protože dočasné tabulky jsou založeny na relaci, nebudeme mít žádný problém s nesprávnými výstupními daty.
SQL FIDDLE Demo
Zkuste tento dotaz:
SELECT
col1, col2, @pv := col3 as 'col3'
FROM
table1
JOIN
(SELECT @pv := 1) tmp
WHERE
col1 = @pv
SQL FIDDLE Demo
:
| COL1 | COL2 | COL3 |
+------+------+------+
| 1 | a | 5 |
| 5 | d | 3 |
| 3 | k | 7 |
Poznámka
parent_id
hodnota by měla být menší nežchild_id
aby toto řešení fungovalo.