mysql_tree_related |  |
mysql_tree_related -- Возвращает части sql-запроса, которые Вы можете использовать для выборки любой части дерева, относящейся к заданной вершине (путь, братья, дети, поддерево)
Содержание
Исходный текст | |
function mysql_tree_related($s_table,$is_path=true,$is_sibling=true,$is_subtree=false,$is_child=true,$is_self=true)
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Эта функция является частью библиотеки mysql.tree
// (c) Yuri Popoff, Aug 2005, popoff.donetsk.ua
// http://popoff.donetsk.ua/text/work/libs/mysql/tree/related/
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
//$s_table - имя таблицы, в которой хранится дерево
//$is_path - включать ли в результат путь к текущей вершине
//$is_sibling - включать ли в результат всех братьев и сестер
//$is_subtree - включать ли в результат все поддерево
//$is_child - включать ли в результат всех детей.
// имеет смысл только если $is_subtree=false.
// Иначе дети всегда включаются
//$is_self - включать ли в результат исходную вершину
//В возвращаемом массиве определены следующие элементы:
// src - идентификатор исходной вершины, для которой следует выбрать путь, братьев,
// детей или все поддерево
// dst - идентификаторы вершин, которые входят в результат
// order - порядок вершин в дереве (на основании структуры дерева)
// level - номер уровня
// from - раздел sql-запроса FROM
// where - раздел sql-запроса WHERE
//Алиасы таблиц:
//mtr_src - узнать данные для исходного узла дерева
//mtr_parent - узнать данные для родителя
//mtr_dst - результат
$sql=array();
$sql['src']='mtr_src.i_id';
$sql['dst']='mtr_dst.i_id';
$sql['order']='mtr_dst.i_left';
$sql['level']='mtr_dst.i_level';
if(($is_path||$is_sibling)&&($is_child||$is_subtree))
$is_self=true;
$a_where=array();
if($is_sibling)
{
$sql['from']=“
”.$s_table.“ as mtr_src left join
".$s_table." as mtr_parent on
mtr_parent.i_level=mtr_src.i_level-1 and
mtr_parent.i_left<mtr_src.i_left and
mtr_parent.i_right>mtr_src.i_right,
".$s_table." as mtr_dst
";
$s="mtr_parent.i_id is not null and
mtr_dst.i_left between mtr_parent.i_left and mtr_parent.i_right and
mtr_dst.i_level=mtr_parent.i_level+1";
if(!$is_self)
{
$s.=' and mtr_dst.i_id<>mtr_src.i_id';
}
$a_where[]=$s;
}
else
{
$sql['from']="
".$s_table." as mtr_src,
".$s_table." as mtr_dst
";
}
if($is_path)
{
if($is_self)
{
$a_where[]="
mtr_dst.i_left<=mtr_src.i_left and
mtr_dst.i_right>=mtr_src.i_right and
mtr_dst.i_level<=mtr_src.i_level";
}
else
{
$a_where[]="
mtr_dst.i_left<mtr_src.i_left and
mtr_dst.i_right>mtr_src.i_right and
mtr_dst.i_level<mtr_src.i_level";
}
}
if($is_subtree)
{
if($is_self)
{
$a_where[]="
mtr_dst.i_left>=mtr_src.i_left and
mtr_dst.i_left<mtr_src.i_right";
}
else
{
$a_where[]="
mtr_dst.i_left>mtr_src.i_left and
mtr_dst.i_left<mtr_src.i_right”;
}
}
elseif($is_child)
{
if($is_self&&!$is_path&&!$is_sibling)
{
$s=“(mtr_dst.i_level=mtr_src.i_level+1 or mtr_dst.i_level=mtr_src.i_level)”;
}
else
{
$s=“mtr_dst.i_level=mtr_src.i_level+1”;
}
$a_where[]=“mtr_dst.i_left between mtr_src.i_left and mtr_src.i_right and ”.$s;
}
//Если self и только sibling, то отдельная проверка для self, потому что
// sibling не существует для корневой вершины
if($is_self&&!$is_path&&!$is_subtree&&!$is_child)
{
$a_where[]=“mtr_dst.i_id=mtr_src.i_id”;
}
if(!count($a_where))
$sql['where']='0';
elseif(count($a_where)==1)
$sql['where']=$a_where[0];
else
$sql['where']='('.implode(' or ',$a_where).')';
return $sql;
}
Пример использования | |
$k_item=1; //Идентификатор текущей вершины
//Загрузить путь, братьев и непосредственных детей
$sql=mysql_tree_related('t_catalog_tree');
$r=mysql_query_log(“
select
t_catalog.k_item,
t_catalog.s_name
from
”.$sql['from'].“,
t_catalog
where
".$sql['where']." and
".$sql['src']."=".$k_item." and
t_catalog.k_item=".$sql['dst']."
order by
".$sql['order']."
”);
Последняя модификация: 06.08.05 17:23 q Не проходите мимо! Оставьте Ваш комментарий в форуме! >>> Цитирование материалов моего сайта приветствуется! при условии видимой действующей! гиперссылки на мой сайт. [Ссылки] Если Вы нашли опечатку на этой странице, пожалуйста, выделите ее мышью и нажмите Ctrl+Enter. Сделаем язык чище! (c) Yuri Popoff, 2004 - 2008, popoff.donetsk.ua, style.donetsk.ua |
|