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

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

  •  05-07-2019
  •  | 
  •  

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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top