sql >> データベース >  >> RDS >> Mysql

MySQLテーブルのツリーパスを取得します

    これがその仕事をする単純な非再帰的なストアドプロシージャです:

    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);
    


    1. SQL Server ODBCドライバーをアップグレードしましたが、パフォーマンスに悪影響がありました。私に何ができる?

    2. 大きなSQLファイルをインポートするときにMySQLサーバーがなくなりました

    3. 名前パターンに一致するMySQLデータベース内のすべてのテーブルを切り捨てます

    4. OracleのASIN()関数