Ben aşağıdaki saklı yordam vardır:
proc_main:begin
declare done tinyint unsigned default 0;
declare dpth smallint unsigned default 0;
create temporary table hier(
AGTREFERRER int unsigned,
AGTNO int unsigned,
depth smallint unsigned default 0
)engine = memory;
insert into hier values (p_agent_id, p_agent_id, dpth);
/* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */
create temporary table tmp engine=memory select * from hier;
while done <> 1 do
if exists( select 1 from agents a inner join hier on a.AGTREFERRER = hier.AGTNO and hier.depth = dpth) then
insert into hier
select a.AGTREFERRER, a.AGTNO, dpth + 1 from agents a
inner join tmp on a.AGTREFERRER = tmp.AGTNO and tmp.depth = dpth;
set dpth = dpth + 1;
truncate table tmp;
insert into tmp select * from hier where depth = dpth;
else
set done = 1;
end if;
end while;
select
a.AGTNO,
a.AGTLNAME as agent_name,
if(a.AGTNO = b.AGTNO, null, b.AGTNO) as AGTREFERRER,
if(a.AGTNO = b.AGTNO, null, b.AGTLNAME) as parent_agent_name,
hier.depth,
a.AGTCOMMLVL
from
hier
inner join agents a on hier.AGTNO = a.AGTNO
inner join agents b on hier.AGTREFERRER = b.AGTNO
order by
-- dont want to sort by depth but by commission instead - i think ??
-- hier.depth, hier.agent_id;
a.AGTCOMMLVL desc;
drop temporary table if exists hier;
drop temporary table if exists tmp;
end proc_main
Fonksiyon işini iyi yapar iken - sadece şu anda AGTCOMMLVL azalan sırayla aracılığıyla sıralama sağlar. Saklı yordamın amacı kendi parentId ve ilişkili COMMLVL ile bir memberID maç için. Bir kez uygun eşleştirilmiş, bunun belirli bir üye hakkında bilgi dönmek için ikinci sorguda memberID kullanın.
Ben filtreler herhangi sayısına göre sıralamak mümkün istiyorum ama şu sorunları olurdu:
Ben alana göre sıralamayı değiştirerek saklı yordam içine bir değişken geçmek için bir yol bulmak gibi olamaz.
Ben olsa dahi - sort aslında sadece (örneğin ilk isim olarak, soyadı, vb) ikinci sorgudan veri içerebilir
Ikinci sorguda bir tür Koşu sözdizimi doğru olsa bile hiçbir şey yok - her zaman geri saklı yordamın tür düşer.
herhangi bir fikir?
EDIT
Benim php kodu ile mysqli kullanır:
$sql = sprintf("call agent_hier2(%d)", $agtid);
$resulta = $mysqli->query($sql, MYSQLI_STORE_RESULT) or exit(mysqli_error($mysqli));