Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Nested sets, MySQL > PostgreSQL / 4 сообщений из 4, страница 1 из 1
25.03.2008, 03:57
    #35210915
zzzstam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nested sets, MySQL > PostgreSQL
Приветствую уважаемое коммьюнити :)

Прошу помощи, ситуация для меня практически безвыходная. На данный момент есть готовое приложение с реализацией Nested Sets в MySQL на базе этой статьи . Сейчас приходится переводить все на PostgreSQL, справился со всем, кроме получения поддерева с вычислением глубины.

В статье в качестве примера используется такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT node.name, (COUNT(parent.name) - (sub_tree.depth +  1 )) AS depth
FROM nested_category AS node,
	nested_category AS parent,
	nested_category AS sub_parent,
	(
		SELECT node.name, (COUNT(parent.name) -  1 ) AS depth
		FROM nested_category AS node,
		nested_category AS parent
		WHERE node.lft BETWEEN parent.lft AND parent.rgt
		AND node.name = 'PORTABLE ELECTRONICS'
		GROUP BY node.name
		ORDER BY node.lft
	)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
	AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
	AND sub_parent.name = sub_tree.name
GROUP BY node.name
ORDER BY node.lft;

Постгрес на подобный запрос ругается таким образом:
Код: plaintext
ERROR:  колонка "node.lft" должна фигурировать в выражении GROUP BY или использоваться в агрегатной функции

Собственно, почему MySQL позволяет что-то, что не позволяет Постгрес (риторический вопрос =) ), и как хотя бы примерно нужно переработать запрос?

Заранее спасибо за любую помощь, проект горит сильно-сильно =(
...
Рейтинг: 0 / 0
25.03.2008, 07:01
    #35210945
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nested sets, MySQL > PostgreSQL
1) лучше использовать явные join
2) ORDER BY node.lft во вложенном запросе не нужен
3) попробуйте вынести сортировку, примерно так
Код: plaintext
1.
2.
3.
4.
select *
from
( -- здесь ваш запрос без order by
)
order by;
...
Рейтинг: 0 / 0
25.03.2008, 08:15
    #35211023
tengu_sarutobi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nested sets, MySQL > PostgreSQL
Если я правильно помню nested sets, то node.name, node.left и node.right находятся на одной строке и имеют взаимно однозначное соответствие. Т.е Вам можно смело дописать в запрос group by node.name, node.left
По какой причине mysql пропускает семантически неверную конструкцию sql сказать к сожалению не могу.
...
Рейтинг: 0 / 0
25.03.2008, 12:25
    #35211695
zzzstam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nested sets, MySQL > PostgreSQL
Serik Akhmetov1) лучше использовать явные join
2) ORDER BY node.lft во вложенном запросе не нужен
3) попробуйте вынести сортировку, примерно так
Код: plaintext
1.
2.
3.
4.
select *
from
( -- здесь ваш запрос без order by
)
order by;


Спасибо, принял к сведению и применил :)

tengu_sarutobiЕсли я правильно помню nested sets, то node.name, node.left и node.right находятся на одной строке и имеют взаимно однозначное соответствие. Т.е Вам можно смело дописать в запрос group by node.name, node.left
По какой причине mysql пропускает семантически неверную конструкцию sql сказать к сожалению не могу.

Да, вы правы, спасибо большое. MySQL вообще достаточно вольно интерпретирует стандарты, насколько я успел понять.

Все заработало, огонь потушен, теперь буду спокойно и вдумчиво разбираться с Постгресом на других проектах. :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Nested sets, MySQL > PostgreSQL / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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