Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can use a non recursive mysql stored procedure which you can call from your php as follows:</p> <p><strong>Example calls</strong></p> <pre><code>$result = $conn-&gt;query(sprintf("call category_hier(%d)", $catID)); mysql&gt; call category_hier(1); +--------+---------------+---------------+----------------------+-------+ | cat_id | category_name | parent_cat_id | parent_category_name | depth | +--------+---------------+---------------+----------------------+-------+ | 1 | Location | NULL | NULL | 0 | | 3 | USA | 1 | Location | 1 | | 5 | Chicago | 3 | USA | 2 | | 4 | Illinois | 3 | USA | 2 | +--------+---------------+---------------+----------------------+-------+ 4 rows in set (0.00 sec) mysql&gt; call category_hier(2); +--------+---------------+---------------+----------------------+-------+ | cat_id | category_name | parent_cat_id | parent_category_name | depth | +--------+---------------+---------------+----------------------+-------+ | 2 | Color | NULL | NULL | 0 | | 6 | Black | 2 | Color | 1 | | 7 | Red | 2 | Color | 1 | +--------+---------------+---------------+----------------------+-------+ 3 rows in set (0.00 sec) </code></pre> <p><strong>Full script and test data below</strong></p> <pre><code>drop table if exists categories; create table categories ( cat_id smallint unsigned not null auto_increment primary key, name varchar(255) not null, parent_cat_id smallint unsigned null, key (parent_cat_id) ) engine = innodb; insert into categories (name, parent_cat_id) values ('Location',null), ('Color',null), ('USA',1), ('Illinois',3), ('Chicago',3), ('Black',2), ('Red',2); drop procedure if exists category_hier; delimiter # create procedure category_hier ( in p_cat_id smallint unsigned ) begin declare v_done tinyint unsigned default 0; declare v_depth smallint unsigned default 0; create temporary table hier( parent_cat_id smallint unsigned, cat_id smallint unsigned, depth smallint unsigned default 0 )engine = memory; insert into hier select parent_cat_id, cat_id, v_depth from categories where cat_id = p_cat_id; create temporary table tmp engine=memory select * from hier; /* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */ while not v_done do if exists( select 1 from categories c inner join tmp on c.parent_cat_id = tmp.cat_id and tmp.depth = v_depth) then insert into hier select c.parent_cat_id, c.cat_id, v_depth + 1 from categories c inner join tmp on c.parent_cat_id = tmp.cat_id and tmp.depth = v_depth; set v_depth = v_depth + 1; truncate table tmp; insert into tmp select * from hier where depth = v_depth; else set v_done = 1; end if; end while; select c.cat_id, c.name as category_name, p.cat_id as parent_cat_id, p.name as parent_category_name, hier.depth from hier inner join categories c on hier.cat_id = c.cat_id left outer join categories p on hier.parent_cat_id = p.cat_id order by hier.depth; drop temporary table if exists hier; drop temporary table if exists tmp; end # delimiter ; call category_hier(1); call category_hier(2); </code></pre> <p>Hope this helps :)</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload