Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод записей по иерархии
 
 автор: tAleks   (30.08.2006 в 20:38)   письмо автору
 
 

Задача следующая:

В одной таблице храняться записи, например: Директор, Гл. Бух. Гл. Инженер, Бухгалтер, Экономист, Инженер. И все это связано ключами, кто кому подчиняется.... т.е. иерархическая древовидная структура.

Когда, например, выбираем директора, нужно показать всех ниже.
Когда выбираем Гл. Бухгалтера, который в свою очередь "под" директором, нужно показать только тех, тро ниже Гл. бухгалтера.

Как организовать такую выборку из базы?

   
 
 автор: Spayker   (31.08.2006 в 01:48)   письмо автору
 
   для: tAleks   (30.08.2006 в 20:38)
 

Наверно надо раздать приоритет..

Колонку в базе
access int(1) - от 0 до 9

Директор - 9
Гл. Бух - 8
и вывоть. Если директов, то показать всех у кого меньше 9. Если Гл. Бух, то показать всех у кого меньше 8 итд ..

я бы наверно так сделал, но профессионала наверно, что нибудь лучше предложат :)

   
 
 автор: cheops   (31.08.2006 в 12:39)   письмо автору
 
   для: tAleks   (30.08.2006 в 20:38)
 

Можно осуществить рекурсивный спуск...

   
 
 автор: tAleks   (31.08.2006 в 16:20)   письмо автору
 
   для: cheops   (31.08.2006 в 12:39)
 

что это такое и как это сделать? Расскажите пожалуйста по подробнее. Очень надо.

   
 
 автор: cheops   (01.09.2006 в 08:48)   письмо автору
 
   для: tAleks   (31.08.2006 в 16:20)
 

Приведите тогда структуру вашей таблицы - как осуществляется связь?

   
 
 автор: tAleks   (01.09.2006 в 17:48)   письмо автору
 
   для: cheops   (01.09.2006 в 08:48)
 

Таблица users такая:

------------------------------
id_users  | name       | id_boss
------------------------------
1         | Иванов     | Null
2         | Петров     | 1
3         | Сидоров    | 1
4         | Устинов    | 2
5         | Кочнев     | 2
------------------------------


Т.е. Иванов самый верхний босс
Петров и Сидоров подчиняются Иванову
Устинов и Кочнив подвиняются Петрову и т.д.

Надо чтобы если мы выбираем Иванова, выводилась вся оранизация, т.к. он самый верхний босс.
Если выбираем Петрова, то выводилась только та организация которая подчиняется тольок ему, т.е. Устинов и Кочнев. и все кто под Устиновым и Кочневым до конца (если таковые есть)

   
 
 автор: cheops   (01.09.2006 в 22:11)   письмо автору
 
   для: tAleks   (01.09.2006 в 17:48)
 

Можно поступить следующим образом
<?php 
  
function funct($id_users
  { 
    
$query "SELECT * FROM tbl WHERE id_boss = $id_users";
    
$res mysql_query($query); 
    if(!
$res) exit(mysql_error()); 
    if(
mysql_num_rows($res) > 0
    { 
      while(
$table mysql_fetch_array($res)) 
      { 
        echo 
$table['name']."<br>";
        
funct($table['id_users']); 
      } 
    } 
  } 
?> 

Функции следует передать перевичный ключ человека для которого необходимо узнать его подчинённых.

   
 
 автор: tAleks   (03.09.2006 в 18:03)   письмо автору
 
   для: cheops   (01.09.2006 в 22:11)
 

Это ведь тогда получиться большое количество отдельных запросов.... А если иерархическая структура состоит из более чем 1000 записей? Не вызовет ли это излишнюю нагрузку и медленное выполнение?

   
 
 автор: cheops   (03.09.2006 в 18:22)   письмо автору
 
   для: tAleks   (03.09.2006 в 18:03)
 

Да может вызвать, но если нужна скорость при такой сложной иерархии, наверное стоит как-то по другому организовать данные.

   
 
 автор: tAleks   (03.09.2006 в 20:54)   письмо автору
 
   для: cheops   (03.09.2006 в 18:22)
 

Хоршо. Тогда сколько максимум записей "вниз" может быть без ущерба для быстродействия? И второй вопрос: Как по другому это можно организовать?

   
 
 автор: cyberface   (03.09.2006 в 18:48)   письмо автору
 
   для: tAleks   (03.09.2006 в 18:03)
 

А нельзя просто вывести начальника и подчиненых таким запросом:

SELECT * FROM tbl WHERE id_boss >= $id_users

?

   
 
 автор: tAleks   (03.09.2006 в 20:53)   письмо автору
 
   для: cyberface   (03.09.2006 в 18:48)
 

Нет, так точно не пойдет, т.к. при таком запросе выдаст всех подчиненных из паралельных веток. А этого не надо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования