4 tabela de junção de modo que apenas 1 resposta é dada para cada empresa em vez de um resultado para cada campanha

StackOverflow https://stackoverflow.com/questions/1407359

  •  05-07-2019
  •  | 
  •  

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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top