Подсчет всех сообщений, принадлежащих категории И ее подкатегориям

Буду очень признателен за помощь в решении моей проблемы:

У меня есть 2 таблицы MySQL, категории и сообщения, выложенные (упрощенно) следующим образом:

категории:

CATID - имя - parent_id

сообщения:

PID - имя - категория

Что я хотел бы сделать, так это получить общее количество сообщений для каждой категории, включая любые сообщения в подкатегориях.

Прямо сейчас я получаю общее количество сообщений в каждой (высокоуровневой) категории (но не в подкатегориях), выполняя:

"SELECT c.*, COUNT(p.PID) as postCount 
        FROM categories AS c LEFT JOIN posts AS p 
        ON (c.CATID = p.category) 
        WHERE c.parent='0' GROUP BY c.CATID ORDER BY c.name ASC"; 

Еще раз возник вопрос: как получить итоговые суммы по каждой категории, включая итоговые суммы по каждой связанной подкатегории?

Реструктуризация базы данных в формате вложенного набора невозможна, так как я поддерживаю существующую систему.

Спасибо за вашу помощь!


person Community    schedule 26.11.2009    source источник


Ответы (2)


Если категории не вложены друг в друга бесконечно, вы можете ПРИСОЕДИНЯТЬСЯ к ним по одному уровню за раз. Вот пример до 3 уровней вложенности:

SELECT c.name, COUNT(DISTINCT p.PID) as postCount 
FROM categories AS c 
LEFT JOIN categories AS c2
    ON c2.parent = c.catid
LEFT JOIN categories AS c3
    ON c3.parent = c2.catid
LEFT JOIN posts AS p 
    ON c.CATID = p.category
    OR c2.CATID = p.category
    OR c3.CATID = p.category
WHERE c.parent = '0' 
GROUP BY c.CATID, c.name
ORDER BY c.name ASC
person Andomar    schedule 26.11.2009
comment
Спасибо за быстрый ответ! Хорошее решение. Я не мог ждать и уже исправил это более громоздким способом: D, однако в следующий раз я воспользуюсь вашим решением. - person ; 26.11.2009

Я думаю, вы хотите взглянуть на оператора Rollup. Я верю, что это даст вам то, что вы хотите.

http://msdn.microsoft.com/en-us/library/ms189305(SQL.90).aspx

Рэнди

person Randy Minder    schedule 26.11.2009
comment
Ссылка MSDN для вопроса MySQL? - person Andomar; 26.11.2009