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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top