[Закрыть]
 
popoff.donetsk.ua
Отморозки долго по горам не ходят. Некому свою отмороженность демонстрировать.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Статьи - Программирование - Модули - mysql - mysql.tree - mysql_tree_related
Я это делаю
Персональное меню
Голосование
Деньги, либо любимое занятие? Постоянный адрес этого вопроса
Ваш возраст (не обязательно):

Введите целое число от 3 до 99.
Почему? (не обязательно):
Другие вопросы
Поиск по сайту
Реклама
Программное обеспечение любой сложности
koins.com.ua
Статистика

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

Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>