Наиболее оптимальные запросы

jenia

Новичок
Наиболее оптимальные запросы

Возникла такая проблема:
Есть каталог ресурсов, в mysql для него две таблицы. В одной таблице дерево (NESTED SETS), во второй данные. Нужно вытянуть такие данные:
1. Родительскую ветвь указанного раздела;
2. Подразделы данного раздела с количеством сайтов в каждом;
3. Данные, которые соответствуют данному разделу в таблице с данными.
В скрипт передаются: right, left, id
Делаю так:
SELECT * FROM catalog WHERE `sec_id` = $id;
- этим запросом вытягиваю данные, которые соответствуют данному разделу.

SELECT catalog_razdeli.id, catalog_razdeli.title, catalog_razdeli.left, catalog_razdeli.right, count(catalog.sec_id)
FROM `catalog_razdeli` LEFT JOIN catalog ON catalog_razdeli.id = catalog.sec_id
WHERE `right` > $left AND `left` < $right GROUP BY `left`;
- этим запросом вытягиваю данные, которые нужны для формирования родительской ветки и с помощью которых формирую подразделы данного раздела с количеством сайтов в каждом.

В написаном меня смущает то, что данные полученные из второго запроса нужно обрабатывать php, чтобы получить требуемый результат. Можно ли сделать более оптимально?

-~{}~ 08.04.06 23:21:

Не могу сообразить. Мне получается даже двух запросов нехватает. Подскажите пожалуйста хоть что-нибудь.
 

jenia

Новичок
Читал. Там описаны основы NESTED SETS и даны ответы на большинство вопросов. Но у меня проблема другая. Я знаю как решить свою задачу с помощью двух запросов и дополнительной обработки в php. И спрашиваю нельзя-ли это же сделать проще и оптимальней.

-~{}~ 09.04.06 17:41:

Вроде немного разобрался. Решил делать двумя запросами. Только вот не могу запрос составить. Нужно чтобы вытягивалась ветка в которой содержится раздел, но не вся, а до уровня раздела + 1. А также, чтобы количество сайтов в разделах выдавалось. Делаю так:
PHP:
SELECT cat_1.id, cat_1.title, cat_1.left, cat_1.right, cat_1.level, count(catalog.sec_id) as kolvo  
FROM `catalog_razdeli` as `cat_1`, `catalog_razdeli` as `cat_2`  
LEFT JOIN catalog ON cat_1.id = catalog.sec_id  
WHERE cat_1.right > $left AND cat_1.left < $right and cat_1.right-1 AND cat_2.level = cat_1.level+1 AND cat_1.level != 0 GROUP BY cat_1.left
Работает не корректно. Подскажите как правильно.

-~{}~ 09.04.06 21:35:

Не могу понять, люди тему вроде смотрят, но ничего не отвечают. Может я вопрос непонятно задал или ещё что-либо не так сделал?
 

jenia

Новичок
Приведенный запрос выдаёт почти правильный результат. Но в результате в поле `kolvo` количество выдаётся слишком большим. Оно каким-то образом умножается на 194. Там, где должно быть 1 - 194, 2 - 388, 3 - 582... и т.д. Где-то небольшая ошибка.

-~{}~ 10.04.06 16:47:

Неужели никто не сталкивался с подобными проблемами. Аж неверится.

-~{}~ 22.04.06 02:56:

Пожалуйста подскажите кто-нибудь как объединить два запроса:
SELECT cat_1.id, cat_1.title, cat_1.left, cat_1.right, cat_1.level
FROM `catalog_razdeli` as `cat_1`, `catalog_razdeli` as `cat_2`
WHERE cat_1.right > $left AND cat_1.left < $right and cat_1.right-1 AND cat_2.level = cat_1.level+1
GROUP BY cat_1.left

и

SELECT cat_1.id, cat_1.title, cat_1.left, cat_1.right, cat_1.level, count(catalog.sec_id) as kolvo
FROM `catalog_razdeli` as `cat_1`
LEFT JOIN catalog ON cat_1.id = catalog.sec_id
WHERE cat_1.right > $left AND cat_1.left < $right
GROUP BY cat_1.left

Я уже бьюсь не один день, но никак не могу сообразить.

-~{}~ 22.04.06 03:55:

Либо как оптимизировать такой запрос:
PHP:
SELECT cat_1.id, cat_1.title, cat_1.left, cat_1.right, cat_1.level, count(catalog.sec_id) as kolvo
FROM `catalog_razdeli` as `cat_1`
LEFT JOIN catalog ON cat_1.id = catalog.sec_id
WHERE cat_1.right > $left AND cat_1.left < $right AND cat_1.level <= (SELECT `level` FROM `catalog_razdeli` WHERE `id` = 6)+1
GROUP BY cat_1.left
 
Сверху