sql >> Databasteknik >  >> RDS >> Mysql

Hur gör man den rekursiva SELECT-frågan i MySQL?

Redigera

Lösningen som nämns av @leftclickben är också effektiv. Vi kan också använda en lagrad procedur för detsamma.

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 //

Vi använder temporära tabeller för att lagra resultat av utdata och eftersom de temporära tabellerna är sessionsbaserade kommer det inte att vara några problem med att utdata är felaktiga.

SQL FIDDLE Demo

Testa den här frågan:

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 |

Obs
parent_id värdet ska vara mindre än child_id för att den här lösningen ska fungera.



  1. Optimalt sätt att RADERA specificerade rader från Oracle

  2. Postgresql intarray fel:odefinierad symbol:pfree

  3. Hämta Oracle-tabelltyp från lagrad procedur med JDBC

  4. Konfigurera Service Broker för asynkron bearbetning