Bearbeiten
Die von @leftclickben erwähnte Lösung ist ebenfalls wirksam. Wir können dafür auch eine gespeicherte Prozedur verwenden.
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 //
Wir verwenden temporäre Tabellen, um die Ergebnisse der Ausgabe zu speichern, und da die temporären Tabellen sitzungsbasiert sind, wird es keine Probleme mit fehlerhaften Ausgabedaten geben.
SQL FIDDLE Demo
Versuchen Sie diese Abfrage:
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 |
Hinweis parent_id
Der Wert sollte kleiner sein als die child_id
damit diese Lösung funktioniert.