Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иерархическая вложенность записей 
:(
    Опции темы
nicka
  Дата 2.6.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



У меня в базе(MYSQL) есть таблица - master-detail - для осуществления неограниченных иерархических
вложенностей записей, т.е есть ключевое поле(id) и поле владельца записи(masterid).

Мне надо осуществить следующее:
Если допустим, у меня есть уровень с 3 под уровнями, т.е 4-ступенчатая вложенность,
то при переходе по этим уровням я хочу иметь на странице линки всех родительских уровней моего
текущего местонахождения.

например, если у меня есть уровни:
Уровень1
Уровень1.1
Уровень1.1.1
Уровень1.1.1.1

ТО если я дойду до, скажем, уровня Уровень1.1.1, то вверху должен быть следующий путь:
Уровень1 >> Уровень1.1
оба залинкованные на соответствующий уровень.

У меня есть sql запрос, который выдает все полчиненные записи, но он почему то в MYSQL
не работает.
Код
SELECT  LPAD (' ', 2 * (LEVEL-1)), *
     FROM tbl
START WITH MASTERID IS NULL
CONNECT BY PRIOR ID = MASTERID


Вообщем не знаю поняли меня или нет, но жду советов...
PM MAIL   Вверх
arial
Дата 2.6.2004, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



PEAR::HTML_Menu
Добавлено @ 22:25
PEAR::HTML_TreeMenu


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
IZ@TOP
Дата 3.6.2004, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



arial
А при чем тут меню? Я между прочим тоже над этой проблемой бьюсь (не очень усердно), допустим у меня может быть неограниченное по вложениям количество разделов, ссылка на родительский объект идет в поле parentid (допустим), SQL запрос должен выбирать записи пока не встретит в этом поле ноль. То есть на примере:
Цитата
row 1: id=14, parentid=8
row 2: id=8, parentid=12
row 3: id=12, parentid=1
row 4: id=1, parentid=0

Вот и как все это выбрать за один запрос? Если только в цикле... но это имхо напряг большой получится hmmm.gif

PS Мне кажется что это по большей степени вопрос в форум по БД.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Master
Дата 3.6.2004, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



Можеш поступить иначе.
Делаеш запрос по masetrid текущего id и находиш его подраздел и таким образом доходиш (создав рекурсию) до коренвого раздела. и получаеш искомый результат.


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
IZ@TOP
Дата 3.6.2004, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Master
То есть это выборка не с кронца, а от начала? А что если там вложенность разделов пару тысяч?
Добавлено @ 12:19
На этом форуме кстате, такая фишка вроде реализована.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 3.6.2004, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



как-то давали вот такую ссылку http://sdm.viptop.ru/articles/sqltrees.html (причём зар пять) smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Master
Дата 3.6.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



IZ@TOP
почему с начала... как раз с конца надо считать...


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
nicka
Дата 3.6.2004, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Код
Код  
SELECT  LPAD (' ', 2 * (LEVEL-1)), *
    FROM tbl
START WITH MASTERID IS NULL
CONNECT BY PRIOR ID = MASTERID  
почему этот код не работает в MYsql , это что не стандартный sql?

Скажите, а если вложенность максимум 10, то насколько оправдано будет использовать цикл?

И еще,
Цитата
Делаеш запрос по masetrid текущего id и находиш его подраздел и таким образом доходиш (создав рекурсию) до коренвого раздела. и получаеш искомый результат.
,
создать рекурсию - это в смысле, использовать цикл, или иначе как-то?



PM MAIL   Вверх
Master
Дата 3.6.2004, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



Цитата
создать рекурсию - это в смысле, использовать цикл, или иначе как-то?

нет не цикл...
вот простейший пример...

Код
function rc($a = 0) {
 echo $a;
 $a++;
 if ($a<=5) {
  rc($a);
 }
}

rc();



--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
IZ@TOP
Дата 3.6.2004, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Master
И как ты предлагаешь сделать такое с помощью SQL? Желательно с примером.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
arial
  Дата 3.6.2004, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Цитата(IZ @ 3.6.2004, 08:46)
arial
А при чем тут меню?

Прежде чем спрашивать, неплохо бы изучить предложенные классы.
У меня всё работает, дерево отрисовывает, обратные ссылки отображает.
Код
<?php

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');

error_reporting(2047);
ini_set('display_errors', 1);

ob_start();
ob_implicit_flush(0);

define('ROOT_DIR',    dirname(__FILE__) . '/');
define('PEAR_DIR',    ROOT_DIR . 'libs/Pear/');

ini_set('include_path', PEAR_DIR);

// Всё что инклюдится - есть компоненты PEAR
// искать на оффсайте.

require_once('Var_Dump.php');

// Создаем таблицу в БД

/*

CREATE TABLE `tree` (
 `id` int(11) NOT NULL default '0',
 `pid` int(11) NOT NULL default '0',
 `title` varchar(255) NOT NULL default '',
 `name` varchar(255) NOT NULL default ''
) TYPE=MyISAM;

INSERT INTO `tree` VALUES (1, 0, 'one', 'Один');
INSERT INTO `tree` VALUES (2, 0, 'two', 'Два');
INSERT INTO `tree` VALUES (3, 0, 'three', 'Три');
INSERT INTO `tree` VALUES (4, 0, 'four', 'Четыре');
INSERT INTO `tree` VALUES (5, 0, 'five', 'Пять');
INSERT INTO `tree` VALUES (6, 1, 'six', 'Шесть');
INSERT INTO `tree` VALUES (7, 1, 'seven', 'Семь');
INSERT INTO `tree` VALUES (8, 1, 'eight', 'Восемь');
INSERT INTO `tree` VALUES (9, 6, 'nine', 'Девять');
INSERT INTO `tree` VALUES (10, 6, 'ten', 'Десять');

*/


// Для ЧПУ использую .htaccess

/*

RewriteEngine on

RewriteCond   %{REQUEST_FILENAME} !-f
RewriteRule .  index.php

*/


class Tree
{

   var $db;
   var $db_prefix;
   var $menu = Array();

   function Tree($dsn, $db_prefix = '')
   {
       require_once('DB.php');
       $this->db = DB::connect($dsn);
       DB::isError($this->db) and die($this->db->getMessage());
       $this->db_prefix = $db_prefix;
   }

   function _getTree($pid = 0, $url = '/')
   {
       $data = Array();
       
       $sql = 'SELECT * '
               . ' FROM `' . $this->db_prefix . 'tree` '
               . ' WHERE pid = ' . $pid;
       
       $result = $this->db->query($sql);
       DB::isError($result) and die($result->getMessage());
       
       $i = 0;
       while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
           $data[$i]['title'] = $row['title'];
           $data[$i]['name']  = $row['name'];
           $data[$i]['url']   = $url . $row['title'] . '/';
           $data[$i]['sub']   = $this->_getTree($row['id'], $data[$i]['url']);
           $i++;
       }

       return $data;
   }

   function _menu($CurrentUrl = '/')
   {
       $data = $this->_getTree();

       require_once 'HTML/Menu.php';
       require_once 'HTML/Menu/ArrayRenderer.php';

       $html_menu =& new HTML_Menu($data);
       $html_menu->forceCurrentUrl($CurrentUrl);
       $renderer =& new HTML_Menu_ArrayRenderer();
       
       $html_menu->render($renderer, 'tree');
       $this->menu['tree'] = $renderer->toArray();

       $html_menu->render($renderer, 'urhere');
       $this->menu['urhere'] = $renderer->toArray();

       $html_menu->render($renderer, 'prevnext');
       $this->menu['prevnext'] = $renderer->toArray();

       $html_menu->render($renderer, 'sitemap');
       $this->menu['sitemap'] = $renderer->toArray();
   }

   function getMenu($CurrentUrl = '/')
   {
       empty($this->menu) and $this->_menu($CurrentUrl = '/');
       return $this->menu;
   }
}

$dsn = 'mysql://1:1@localhost/1';
$tree = new Tree($dsn);
$menu = $tree->getMenu($_SERVER['REQUEST_URI']);

Var_Dump::display($menu);

?>


Это сообщение отредактировал(а) arial - 3.6.2004, 19:38


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
nicka
Дата 4.6.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Цитата
Скажите, а если вложенность максимум 10, то насколько оправдано будет использовать цикл?


Никто не знает? hmmm.gif
PM MAIL   Вверх
Master
Дата 4.6.2004, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



IZ@TOP
я на пальцах объесню... имеем parent_id текущей страницы. Ищем запросом через WHERE id = parent_id. Находим... если parent_id найденого id не корневой что обозначается обычно 0 или null передаем значение parent_id найденого id дальше в ту же функцию и собираем путь...


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
IZ@TOP
Дата 4.6.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Master
Блин, как это с помощью SQL реализовать? С помощью РНР я и так знаю как сделать - цикл/рекурсия. А мне на SQL надо!

PS SQL запрос можно увидеть?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Master
Дата 4.6.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



Код
SELECT ид_родителя FORM table WHERE ид = ид_родителя_текущего_раздела
smile.gif
Пихаеш это в функцию и вызываеш её снова если ид_родителя не корневой и в качестве аргумента передаеш ей вытащиный ид_родителя и так едеш до корня smile.gif


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.