@ Symbol - a solution for Recursive SELECT query in Mysql?

前端 未结 4 378
孤城傲影
孤城傲影 2020-12-03 12:51

there are a lot of questions about Recursive SELECT query in Mysql, but most of answers is that \"There NO solution for Recursive SELECT query in Mysql\".

Actually t

相关标签:
4条回答
  • 2020-12-03 13:31

    In my limited deep of hierarchy-levels, I used the following:

    parents:

    select * from mytable
    join (
        select A.id Aid,B.id Bid, C.id Cid, D.id Did, E.id Eid, F.id Fid,G.id Gid, H.id Hid from mytable A
        left join mytable B on B.id=A.parent
        left join mytable C on C.id=B.parent
        left join mytable D on D.id=C.parent
        left join mytable E on E.id=D.parent
        left join mytable F on F.id=E.parent
        left join mytable G on G.id=F.parent
        left join mytable H on H.id=G.parent
        where A.id=9
    ) X
    where id in (Aid,Bid,Cid,Did,Eid,Fid,Gid,Hid);
    

    children:

    select * from mytable where id in (
    select distinct id from mytable
    join (
        select A.id Aid,B.id Bid, C.id Cid, D.id Did, E.id Eid, F.id Fid,G.id Gid, H.id Hid FROM mytable A
        left join mytable B on B.parent=A.id
        left join mytable C on C.parent=B.id
        left join mytable D on D.parent=C.id
        left join mytable E on E.parent=D.id
        left join mytable F on F.parent=E.id
        left join mytable G on G.parent=F.id
        left join mytable H on H.parent=G.id
        Where A.id=1
    ) X
    where id in (Aid,Bid,Cid,Did,Eid,Fid,Gid,Hid)
    

    );

    0 讨论(0)
  • 2020-12-03 13:32

    I keep wondering if something like this would work:

    select distinct col1, col2
    from (select col1, col2,
                 @pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, ',', col3) 
                       end) as 'col3'
          from table1 join
              (select @pv:='1') tmp
              on find_in_set(col1, @pv) > 0
         ) t
    

    Something like this should work for small data sets. However, the idea of putting all the ids in a string is limited to the capacity of a string.

    0 讨论(0)
  • 2020-12-03 13:42

    Stored procedure is the best way to do it. Because Gordon's solution would work only if the data follows the same order.

    If we have a table structure like this

    col1 - col2 - col3
    3 - k - 7
    5 - d - 3
    1 - a - 5
    6 - o - 2
    2 - 0 - 8
    

    It wont work.

    Here is a sample procedure code to achieve the same.

    delimiter //
    CREATE PROCEDURE chainReaction 
    (
        in inputNo int
    ) 
    BEGIN 
        declare final_id int default NULL;
        SELECT col3 into final_id from table1
        where col1 = inputNo;
        if( final_id is not null) then
            insert into results(select col1, col2, col3 from table1 where col1 = inputNo);
            CALL chainReaction(final_id);   
        end if;
    END//
    delimiter ;
    
    call chainReaction(1);
    select * from results;
    drop table if exists results;
    
    0 讨论(0)
  • 2020-12-03 13:50

    Had more of a play. Can't get it to work using the user variables due to the ordering of items.

    However if you have a reasonable maximum number of levels then you can do something like this:-

    SELECT CONCAT_WS('-', a.allCols, b.allCols, c.allCols, d.allCols, e.allCols, f.allCols, g.allCols, h.allCols, i.allCols, j.allCols, k.allCols, l.allCols, m.allCols)
    FROM (SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) a
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) b ON a.col3 = b.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) c ON b.col3 = c.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) d ON c.col3 = d.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) e ON d.col3 = e.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) f ON e.col3 = f.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) g ON f.col3 = g.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) h ON g.col3 = h.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) i ON h.col3 = i.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) j ON i.col3 = j.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) k ON j.col3 = k.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) l ON k.col3 = l.col1
    LEFT OUTER JOIN(SELECT col1, col3, CONCAT(col1, col2, col3) AS allCols FROM table1) m ON l.col3 = m.col1
    WHERE a.col1 = 1
    

    This is coping with up to 13 levels (OK, only a couple used in your test data), and will give a comma separated bit for each column, with each row joined with a dash (-).

    0 讨论(0)
提交回复
热议问题