|
|
|
| Задача следующая:
В одной таблице храняться записи, например: Директор, Гл. Бух. Гл. Инженер, Бухгалтер, Экономист, Инженер. И все это связано ключами, кто кому подчиняется.... т.е. иерархическая древовидная структура.
Когда, например, выбираем директора, нужно показать всех ниже.
Когда выбираем Гл. Бухгалтера, который в свою очередь "под" директором, нужно показать только тех, тро ниже Гл. бухгалтера.
Как организовать такую выборку из базы? | |
|
|
|
|
|
|
|
для: tAleks
(30.08.2006 в 20:38)
| | Наверно надо раздать приоритет..
Колонку в базе
access int(1) - от 0 до 9
Директор - 9
Гл. Бух - 8
и вывоть. Если директов, то показать всех у кого меньше 9. Если Гл. Бух, то показать всех у кого меньше 8 итд ..
я бы наверно так сделал, но профессионала наверно, что нибудь лучше предложат :) | |
|
|
|
|
|
|
|
для: tAleks
(30.08.2006 в 20:38)
| | Можно осуществить рекурсивный спуск... | |
|
|
|
|
|
|
|
для: cheops
(31.08.2006 в 12:39)
| | что это такое и как это сделать? Расскажите пожалуйста по подробнее. Очень надо. | |
|
|
|
|
|
|
|
для: tAleks
(31.08.2006 в 16:20)
| | Приведите тогда структуру вашей таблицы - как осуществляется связь? | |
|
|
|
|
|
|
|
для: cheops
(01.09.2006 в 08:48)
| | Таблица users такая:
------------------------------
id_users | name | id_boss
------------------------------
1 | Иванов | Null
2 | Петров | 1
3 | Сидоров | 1
4 | Устинов | 2
5 | Кочнев | 2
------------------------------
|
Т.е. Иванов самый верхний босс
Петров и Сидоров подчиняются Иванову
Устинов и Кочнив подвиняются Петрову и т.д.
Надо чтобы если мы выбираем Иванова, выводилась вся оранизация, т.к. он самый верхний босс.
Если выбираем Петрова, то выводилась только та организация которая подчиняется тольок ему, т.е. Устинов и Кочнев. и все кто под Устиновым и Кочневым до конца (если таковые есть) | |
|
|
|
|
|
|
|
для: 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']);
}
}
}
?>
|
Функции следует передать перевичный ключ человека для которого необходимо узнать его подчинённых. | |
|
|
|
|
|
|
|
для: cheops
(01.09.2006 в 22:11)
| | Это ведь тогда получиться большое количество отдельных запросов.... А если иерархическая структура состоит из более чем 1000 записей? Не вызовет ли это излишнюю нагрузку и медленное выполнение? | |
|
|
|
|
|
|
|
для: tAleks
(03.09.2006 в 18:03)
| | Да может вызвать, но если нужна скорость при такой сложной иерархии, наверное стоит как-то по другому организовать данные. | |
|
|
|
|
|
|
|
для: cheops
(03.09.2006 в 18:22)
| | Хоршо. Тогда сколько максимум записей "вниз" может быть без ущерба для быстродействия? И второй вопрос: Как по другому это можно организовать? | |
|
|
|
|
|
|
|
для: tAleks
(03.09.2006 в 18:03)
| | А нельзя просто вывести начальника и подчиненых таким запросом:
SELECT * FROM tbl WHERE id_boss >= $id_users
|
? | |
|
|
|
|
|
|
|
для: cyberface
(03.09.2006 в 18:48)
| | Нет, так точно не пойдет, т.к. при таком запросе выдаст всех подчиненных из паралельных веток. А этого не надо. | |
|
|
|