Portál AbcLinuxu, 12. května 2025 14:08
id | polozka 1 | darcekova krabica 2 | kancelarsky darcek 3 | pero 4 | ceruzka 5 | tuha 6 | voucher 7 | obalt2
t1_id | obsah (opäť je to odkaz na t1.id) 1 | 2 1 | 6 2 | 3 2 | 4 4 | 5 4 | 7Čiže máme tabuľku t1, ktorá obsahuje nejaký produkt, ktorý sa z niečoho skladá a to zloženie je definované v tabuľke t2. Čiže v tomto príklade za darčeková krabica skladá z kancelárskeho darčeka a vouchera. Ale kancelársky darček sa skladá z pera a ceruzky. A nakoniec ceruzka sa skladá z tuhy a obalu. A ja potrebujem všetky id z ktorých sa skladá nadradený produkt (v tomto príklade darčeková krabica). Predpokladám, že toto je úloha pre rekurziu a zatiaľ som stvoril takéto niečo:
delimiter // create procedure get_product(in id int) this_proc:begin declare loop_begin int; declare recursion int; set loop_begin=0; set recursion=0; set @trans=(select concat("trans_", replace(uuid(), '-', ''))); set @create = concat('create temporary table if not exists ', @trans, '(id int unsigned not null auto_increment primary key, data int)'); prepare stmt from @create; execute stmt; deallocate prepare stmt; set @insert = concat('insert into ', @trans, ' select NULL, obsah from t2 where t1_id=', id); prepare stmt from @insert; execute stmt; deallocate prepare stmt; set @select = concat('select max(id) into @loop_end from ', @trans); prepare stmt from @select; execute stmt; deallocate prepare stmt; if(@loop_end is not null) then while(loop_begin<@loop_end) do set loop_begin=loop_begin+1; set @select = concat('select data into @result from ', @trans, ' where id=', loop_begin); prepare stmt from @select; execute stmt; deallocate prepare stmt; set recursion=@result; select recursion; call get_product(recursion); end while; end if; end// delimiter ;Ale táto procedúra mi končí keď sa dostane na položku ktorá už nikde neodkazuje. Čiže v tomto príklade dostanem 1,2,3. Vie mi s tým niekto pomôcť? Za všetky rady vám vopred veľmi pekne ďakujem.
Řešení dotazu:
id
a parent_id
. A pak tam budeš mít vypočítávané sloupečky tree_left
, tree_right
, tree_depth
. Případně ještě můžeš přidat tree_root_id
, pokud máš mnoho malých stromů (pro rychlejší updaty).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.