4 jointures de table de sorte qu'une seule réponse soit donnée pour chaque entreprise au lieu d'un résultat pour chaque campagne
Question
Merci pour votre aide!
Je voudrais générer toutes les entrées companyName qui ont été téléchargées sur l'un de leurs fichiers server comme:
companies.companyName - count (files.fileID) - sum (serverFiles.uniqueUploads)
Initech Ltd. - 11 - 24931
Epiphyte Inc. - 23 - 938821
Voici les parties les plus pertinentes de la structure de ma table:
Tableau: entreprises
companyID (INT) - companyName (TEXT)
Tableau: campagnes
campaignID(INT) - companyID (INT)
Tableau: fichiers
fileID (INT) - campaignID (INT)
Tableau: fichiers_serveur serverFileID (INT) - fichierID (INT) - uniqueUploads (INT)
Chaque entreprise peut avoir plusieurs campagnes.
Chaque campagne peut avoir plusieurs fichiers.
Chaque fichier peut avoir plusieurs serverFiles
La requête que j'ai essayé d'utiliser est la suivante:
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;
Toutefois, cela renvoie plusieurs entrées pour chaque société (car cela crée plusieurs sorties pour chaque société - une pour chaque campagne de la société).
par exemple:
companies.companyName - count (files.fileID) - sum (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)
Comment puis-je modifier la requête pour ne me donner qu'une réponse pour chaque entreprise, en résumant toutes les campagnes de cette entreprise?
Merci beaucoup pour votre aide.
La solution
Je pense que votre requête est correcte, à l'exception de la clause GROUP BY. Devrait être
GROUP BY companies.companyName
Autres conseils
Ajoutez le nom de la société au groupe et effectuez une opération MIN / MAX pour en saisir un dans la liste de sélection.
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;