powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Для теж у кого mysql 4.1 помогите провести эксперемент
9 сообщений из 9, страница 1 из 1
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32172404
Valerik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу понят у метя только одного такой глюк или у когото еще

создайте таблицу с такими данными
CREATE TABLE Personnel (ID INTEGER PRIMARY KEY, ParentID INTEGER,Data date, Info Char(10), Sell INTEGER,stat Char(1),deltastatus INTEGER, lft INTEGER NOT NULL, rgt INTEGER NOT NULL, Unlft INTEGER ,unrgt INTEGER ;

INSERT INTO Personnel VALUES (1,0,’2003-05-27’, p1,3,'p', 2,1, 14,0,0);
INSERT INTO Personnel VALUES (2, 1, ‘2003-05-27’, ‘p2’ ,2 ,’p’, 1 ,2 ,7, 0 ,0);
INSERT INTO Personnel VALUES (3, 1, ‘2003-05-27’, p3 ,1, ‘p’, 1, 8 ,13, 0, 0);
INSERT INTO Personnel VALUES (4, 2, ‘2003-05-27’, ‘p4’, 0, ‘p’, 1, 3, 4, 0, 0);
INSERT INTO Personnel VALUES (5, 2, ‘2003-05-27’, ‘p5’, 0, ‘p’, 1, 5, 6, 0, 0);
INSERT INTO Personnel VALUES (6, 1, ‘2003-05-27’, ‘p6’, 0, ‘p’, 1, 9, 10, 0, 0);
INSERT INTO Personnel VALUES (7, 3, ‘2003-05-27’, ‘p7’, 0, ‘p’, 1, 11, 12, 0, 0);

ввобщем должна получиться такая вот таблица.
ID ParentID Data Info Sell stat deltastatus lft rgt Unlft unrgt
1 0 2003-05-27 p1 3 p 2 1 14 0 0
2 1 2003-05-27 p2 2 p 1 2 7 0 0
3 1 2003-05-27 p3 1 p 1 8 13 0 0
4 2 2003-05-27 p4 0 p 1 3 4 0 0
5 2 2003-05-27 p5 0 p 1 5 6 0 0
6 1 2003-05-27 p6 0 p 1 9 10 0 0
7 3 2003-05-27 p7 0 p 1 11 12 0 0

Далее попробуте сделать такой запрос.
select x.ID, (select COUNT(P.ID) FROM personnel P WHERE P.lft BETWEEN x.lft AND x.rgt ) FROM personnel x ";
__________________________________________
Что у вам в результате получилось...?
результаты в ставьте в ответ..
Уменя получилось вот так
ID (select COUNT(P.ID) FROM personnel P WHERE P.lft BETWEEN x.lft AND x.rgt )
1 7
2
3
4
5
6
7
_________________________________________
Хотя по идеи должно быть так
ID (select COUNT(P.ID) FROM personnel P WHERE P.lft BETWEEN x.lft AND x.rgt )
1 7
2 3
3 3
4 1
5 1
6 1
7 1
______________________________________
Я незна в чем тут глюк... помогите разобраться
заране блогодарен за помощь.
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32172672
KP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KP
Гость
Попробуй проще сделать:

select
x.ID,
count(p.ID)
from
personnel x,
personnel p
where
p.lft between x.lft and x.rgt
group by
x.id

Даже на mysql 3.x срабатывает :)
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32172696
Ryback
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем вложенный запрос?
Код: plaintext
1.
select x.ID, COUNT(P.ID) FROM Personnel P, Personnel x WHERE P.lft BETWEEN x.lft AND x.rgt GROUP BY x.ID;


И все.
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32173230
Valerik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за помошь...
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32173774
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По любому советую почитать !

mahoune
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32177146
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valerik
Сделал несколько постов в форуме по одной и той же теме. Объяснил бы сначала с чем имеешь дело, а потом бы спрашивал в несколько пунктов.

Вот тебе статья по твоим "деревьям", где расписаны основные идеи по работе с ними. Учи матчась!
Деревья в SQL

А по теме... Задача решается куда проще :)
Код: plaintext
1.
2.
select id, (rgt - lft +  1 )/ 2  weight 
from Personnel 
order by id;

Этот запрос возвращает тот же результат и при этом выполняется быстрее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        ID     WEIGHT
 ---------- ----------
 
          1            7 
          2            3 
          3            3 
          4            1 
          5            1 
          6            1 
          7            1 

 7  rows selected.


Фишка в том, что твое дерево и так построено на множественной модели деревьев, поэтому при подсчете числа вложенных вершин достаточно вычесть из правой границы левую, а затем если надо посчитать число:
* только вложенных вершин, то вычесть из той суммы 1 и разделить на 2
* вложенных вершин с учетом данной, то прибавить к сумме 1 и разделить на 2

Итог. Зная хотя бы базовые понятия о правилах, по которым работает множественная модель деревьев, не надо будет городить огород.
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32177867
Valerik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я это все знаю просто вложенные запроссы внем обязательны там в дальнейшем идет сортировка еще по други пармерма.
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32178173
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если не секрет, приведи пример. Может действительно можно сделать иначе, чем ты это сделал? :)

Помни - в базах данных не бывает уникальных решений одной и той же задачи. Практически всегда можно привести несколько вариантов и из них уже выбирать лучший.
...
Рейтинг: 0 / 0
Для теж у кого mysql 4.1 помогите провести эксперемент
    #32178877
Valerik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там в в подчете левых правых еще учитываеться несколько парметров.
так что просто отнимать значение лево право . это не годиться. так мы получим значение сколько всего левых и правых.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Для теж у кого mysql 4.1 помогите провести эксперемент
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]