4 tabela de junção de modo que apenas 1 resposta é dada para cada empresa em vez de um resultado para cada campanha
Pergunta
Obrigado por sua ajuda!
Eu gostaria de saída de todas as entradas CompanyName que têm envios em qualquer de suas ServerFiles como:
companies.companyName - count (files.fileID) - soma (serverFiles.uniqueUploads)
Initech Ltd. - 11 - 24931
Epiphyte Inc. - 23 - 938821
Aqui estão as peças relavent da minha estrutura de tabela:
Tabela: empresas
companyID (INT) - companyName (TEXT)
Tabela: campanhas
campaignID(INT) - companyID (INT)
Tabela: arquivos
fileID (INT) - campaignID (INT)
Tabela: ServerFiles serverFileID (INT) - FileID (INT) - uniqueUploads (INT)
Cada empresa pode ter várias campanhas.
Cada campanha pode ter vários arquivos.
Cada arquivo pode ter vários ServerFiles
A consulta Tentei uso é a seguinte:
SELECT companies.companyName, sum(serverFiles.uniqueUploads), count(files.fileID)
FROM companies
INNER JOIN campaigns on companies.companyID = campaigns.companyID
INNER JOIN files on files.campaign = campaigns.campaignID
LEFT OUTER JOIN serverFiles on serverfiles.fileID = files.fileID
GROUP BY serverFiles.uniqueUploads, files.fileID
ORDER BY sum(serverFiles.uniqueUploads) DESC;
No entanto, este retorna várias entradas para cada empresa (como ele cria várias saídas para cada empresa - um para cada campanha no âmbito da empresa).
por exemplo:
companies.companyName - count (files.fileID) - soma (serverFiles.uniqueUploads)
Initech Ltd. - 2 - 234234 (for initech campaign1)
Initech Ltd. - 4 - 223323 (for initech campaign2)
Epiphyte Inc. - 13 - 6434 (for epiphyte campaign1)
Initech Ltd. - 1 - 554 (for initech campaign3)
Epiphyte Inc. - 13 - 7544 (for epiphyte campaign2)
Epiphyte Inc. - 11 - 74545 (for epiphyte campaign3)
Epiphyte Inc. - 23 - 456544 (for epiphyte campaign4)
Como faço para alterar a consulta para me dar apenas uma volta de resposta para cada empresa, resumindo todas as campanhas em que a empresa.
Muito obrigado por qualquer ajuda.
Solução
A sua consulta é bom, eu acho que, com exceção da cláusula GROUP BY. Deve ser
GROUP BY companies.companyName
Outras dicas
Adicione o nome da empresa para o grupo e realizar uma MIN / MAX para uma agarra na lista de seleção.
SELECT MAX(companies.companyName), sum(serverFiles.uniqueUploads), count(files.fileID)
FROM companies
INNER JOIN campaigns on companies.companyID = campaigns.companyID
INNER JOIN files on files.campaign = campaigns.campaignID
LEFT OUTER JOIN serverFiles on serverfiles.fileID = files.fileID
GROUP BY companies.companyName, serverFiles.uniqueUploads, files.fileID
ORDER BY sum(serverFiles.uniqueUploads) DESC;