NestedSets и связанные записи в других таблицах

sokol

Zavolga.Net
NestedSets и связанные записи в других таблицах

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

Помогите с запросом (или несколькими) который посчитает количество связанных записей в определенных каталогах с учетом всех его подкаталогов.

Т.е. есть каталоги
1. Видеокарты
2. Процессоры
3. Охлаждающие устройства
...
и.т.д

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

Задача посчитать количество записей во всех перечисленных каталогах с учетом подкаталогов.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: NestedSets и связанные записи в других таблицах

Автор оригинала: sokol
Задача посчитать количество записей во всех перечисленных каталогах с учетом подкаталогов.
Хе-хе-хе. Я тут кажется в своё время уже приводил этот замечательный запрос:
Код:
SELECT r1.rubric_id, rubric_number, rubric_name, sum(total) AS sum_total
FROM
(
    SELECT c.rubric_id, c.rubric_left, c.rubric_right, c.rubric_number, c.rubric_name
    FROM rubrics_new c, rubrics_new p
    WHERE c.rubric_left BETWEEN p.rubric_left AND p.rubric_right
    GROUP BY c.rubric_id, c.rubric_left, c.rubric_right, c.rubric_number, c.rubric_name
    HAVING count(p.rubric_id) = 2
) AS r1,
(
    SELECT r.rubric_id, rubric_left, rubric_right, count(vac_id) AS total
    FROM rubrics_new r LEFT JOIN vacancies v USING(rubric_id)
    GROUP BY r.rubric_id, rubric_left, rubric_right
) AS r2
WHERE r2.rubric_left BETWEEN r1.rubric_left AND r1.rubric_right
      AND r2.rubric_right BETWEEN r1.rubric_left AND r1.rubric_right
GROUP BY r1.rubric_id, rubric_number, rubric_name
ORDER BY rubric_number
таблица rubrics_new содержит дерево по модели Nested Sets, в таблице vacancies связанные записи.
 

sokol

Zavolga.Net
Sad Spirit сенькью!

-~{}~ 01.09.04 16:59:

Sad Spirit
А какая у тебя версия MySQL?
Просто у меня ругается на подзапросы вот так

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT st.id, st.loffset, st.roffset, COUNT(price.id) AS total
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: sokol
А какая у тебя версия MySQL?
вот такая:
Код:
optimal=# select version();
                           version                           
-------------------------------------------------------------
 PostgreSQL 7.4.2 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)
;)

Просто у меня ругается на подзапросы вот так
ну тогда сделай CREATE TEMPORARY TABLE с рез-тами подзапросов а потом уже по ним запрос.
 

sokol

Zavolga.Net
Ну и тормоз будет однако?
Ничего другого для MySQL не придумано?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: sokol
Ничего другого для MySQL не придумано?
Ну в документации по мысклю сказано, что большую часть подзапросов можно выразить через JOIN. Можешь сам потренироваться или местных гуру попросить, а то они уверены что мыскль --- это круто, вот пусть для него задачку порешают.
 

Апельсин

Оранжевое создание
> Ну и тормоз будет однако?

проверь

> Ничего другого для MySQL не придумано?

в версии 4.1. должен работать ..
 

sokol

Zavolga.Net
Пока получилось вот так,

PHP:
DROP TEMPORARY TABLE IF EXISTS r1count;
CREATE TEMPORARY TABLE r1count
(
     SELECT st.id, st.loffset, st.roffset, COUNT(price.id) AS total
     FROM elogic_struct st LEFT JOIN elogic_prices price ON st.id = price.foldid
     GROUP BY st.id
     HAVING COUNT(price.id) != 0
);

SELECT elogic_struct.id, elogic_struct.level, elogic_struct.title, SUM(r1count.total) AS sum_total
FROM elogic_struct LEFT JOIN r1count ON (r1count.loffset BETWEEN elogic_struct.loffset AND elogic_struct.roffset)
GROUP BY elogic_struct.id
ORDER BY elogic_struct.root, elogic_struct.loffset, elogic_struct.priority;
110 строк вызвано (0,05 сек)

Получает всю структуру в виде

Раздел1 (кол_во)
Раздел2 (кол_во)
Раздел3 (кол_во)
Раздел4 (кол_во)
Раздел5 (кол_во)

Может кто боле оптиммальный вариант предложит?
 
Сверху