4表连接,以便每个公司只给出1个响应,而不是每个广告系列的结果

时间:2009-09-10 19:50:49

标签: mysql join group-by

感谢您的帮助!

我想输出所有在任何serverFiles上传的公司名称条目:

companies.companyName - count(files.fileID) - sum(serverFiles.uniqueUploads)

Initech Ltd.   -  11 -  24931
Epiphyte  Inc.  -  23  - 938821

以下是我的表结构的相关部分:

表:公司

companyID (INT)  -  companyName (TEXT)

表:广告系列

campaignID(INT)  -  companyID (INT)

表格:文件

fileID (INT)  -  campaignID (INT)

表:serverFiles     serverFileID(INT) - fileID(INT) - uniqueUploads(INT)

每家公司都可以有多个广告系列。

每个广告系列都可以包含多个文件。

每个文件可以有多个serverFiles

我尝试使用的查询如下:

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;

但是,这会为每个公司返回多个条目(因为它为每个公司创建多个输出 - 一个用于公司下的每个广告系列)。

例如:

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)

如何更改查询,只为每个公司提供一个回复,总结该公司下的所有广告系列。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我认为您的查询很好,但GROUP BY子句除外。应该是

GROUP BY companies.companyName

答案 1 :(得分:0)

将公司名称添加到组中并执行MIN / MAX以在选择列表中抓取一个。

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;