Accessing a temporary table multiple times in MySql

前端 未结 4 1912
伪装坚强ぢ
伪装坚强ぢ 2021-01-12 23:29

I have tried to use a temporary table as an intermediate result holder for a SELECT statement. The problem is though that I can\'t access the temp table multiple times in ot

4条回答
  •  滥情空心
    2021-01-13 00:07

    Known bug (feature) - read http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

    Here's how i work around the problem...

    drop table if exists employees;
    create table employees
    (
    emp_id smallint unsigned not null auto_increment primary key,
    name varchar(255) not null,
    boss_id smallint unsigned null,
    key (boss_id)
    )
    engine = innodb;
    
    insert into employees (name, boss_id) values
    ('f00',null), 
      ('ali later',1), 
      ('megan fox',1), 
          ('jessica alba',3), 
          ('eva longoria',3), 
             ('keira knightley',5), 
                ('liv tyler',6), 
                ('sophie marceau',6);
    
    
    drop procedure if exists employees_hier;
    
    delimiter #
    
    create procedure employees_hier
    (
    in p_emp_id smallint unsigned
    )
    begin
    
    declare v_done tinyint unsigned default(0);
    declare v_dpth smallint unsigned default(0);
    
    create temporary table hier(
     boss_id smallint unsigned, 
     emp_id smallint unsigned, 
     depth smallint unsigned
    )engine = memory;
    
    insert into hier select boss_id, emp_id, v_dpth from employees where emp_id = p_emp_id;
    
    /* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */
    
    create temporary table emps engine=memory select * from hier;
    
    while not v_done do
    
        if exists( select 1 from employees e inner join hier on e.boss_id = hier.emp_id and hier.depth = v_dpth) then
    
            insert into hier select e.boss_id, e.emp_id, v_dpth + 1 
                from employees e inner join emps on e.boss_id = emps.emp_id and emps.depth = v_dpth;
    
            set v_dpth = v_dpth + 1;            
    
            truncate table emps;
            insert into emps select * from hier where depth = v_dpth;
    
        else
            set v_done = 1;
        end if;
    
    end while;
    
    select 
     e.emp_id,
     e.name as emp_name,
     p.emp_id as boss_emp_id,
     p.name as boss_name,
     hier.depth
    from 
     hier
    inner join employees e on hier.emp_id = e.emp_id
    left outer join employees p on hier.boss_id = p.emp_id;
    
    drop temporary table if exists hier;
    drop temporary table if exists emps;
    
    end #
    
    delimiter ;
    
    -- call this sproc from your php
    
    call employees_hier(1);
    

提交回复
热议问题