А как ты борешься с петлями в рекурсии, массив создаёшь?Автор оригинала: Falc
doctor Ruust
>>В PHP5 с MySQL4.1 ты его один раз откомпилишь (mysqli_prepare, кажется), а потом несколько раз будешь использовать.
Про это неслышал, да и ПХП 5 еще нету.
С обычной рекурсией в ПХП тоже никакиз JOINов, и на 2 запроса меньше.
/*
create table T ( id int, pid int );
insert T values (1,0),(2,1),(3,2),(4,3),(5,4),(6,6);
*/
mysql_query('select @set:="", @id:=4');
$sql = '
select @set := if(@set = "", id, concat(@set, ",", id)), (@id := pid) as pid, id
from T
where not find_in_set(@id, @set) and id = @id';
while($row = mysql_fetch_array(mysql_query($sql))) {
echo $row['id'] . '<br>';
}
//возвращает полную информацию о теме, включая есть ли у нее файлы, подтемы и названия тем верхнего уровня(при их наличии)
sql_query="select themes.cat_id, themes.cat_name, themes.cat_nameeng, themes.cat_level, themes.cat_cid,
th1.cat_id as th1_id, th1.cat_name as th1_name, th1.cat_nameeng as th1_nameeng,
th2.cat_id as th2_id, th2.cat_name as th2_name, th2.cat_nameeng as th2_nameeng,
count(fl_cid) as count_files, count(th0.cat_cid) as count_podtheme
from (((themes left join themes as th1 on themes.cat_cid = th1.cat_id)
left join themes as th2 on th1.cat_cid = th2.cat_id) left join files on themes.cat_id = fl_cid)
left join themes as th0 on themes.cat_id = th0.cat_cid
where themes.cat_id=$id group by themes.cat_id";
Спорить об эффективности бессмысленно - нужно исходить от поставленной цели и исходных данных.нормальной считаю такую организацию дерева, при которой, например:
Можно вывести всю цепочку от текущего элемента до верхнего одним SQL запросом
Вот тебе идея. Вот ее и юзай ее, а не собирай исходники по разным форумам и делай из них "что-то".Можно и так.
mysql_query('select @prev:=0');
$sql = 'select (@prev := id) as id, cid from table where cid = @prev';
while($row = mysql_fetch_array(mysql_query($sql))) {
}
Дополняя сказанное. Данная конструкция все же будет очень долго работать (в большинстве случаев) так что лучше (imho) делатьwhile($row = mysql_fetch_array(mysql_query($sql)))