Contando todas as mensagens pertencentes a uma categoria e suas subcategorias
-
05-07-2019 - |
Pergunta
Eu realmente aprecio alguma ajuda com o meu problema:
Eu tenho 2 tabelas MySQL, categorias e mensagens, colocado para fora (simplificado) assim:
categorias :
CATID - nome - parent_id
mensagens :
PID - nome - categoria
O que eu gostaria de fazer é obter a quantidade total de lugares para cada categoria, incluindo quaisquer mensagens em subcategorias.
Agora eu estou recebendo o número total de lugares em cada (de nível superior) categoria (mas não subcategorias) fazendo:
"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";
A questão é mais uma vez, como posso obter as somas totais para cada categoria, incluindo os totais de cada subcategoria relacionada?
A reestruturação do banco de dados para um formato de conjunto aninhado não é possível, como eu estou mantendo um sistema existente.
Obrigado por sua ajuda!
Solução
Se as categorias não são aninhados infinitamente, você pode se juntar a eles um nível de cada vez. Aqui está um exemplo para até 3 níveis de aninhamento:
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
Outras dicas
Eu acho que você quer olhar para o operador Rollup. Eu acredito que isso vai te dar o que você quer.
http://msdn.microsoft.com/ en-us / library / ms189305 (SQL.90) .aspx
Randy