Объединение в 4 таблицы, так что для каждой компании дается только 1 ответ, а не результат для каждой кампании. - PullRequest
1 голос
/ 10 сентября 2009

Спасибо за вашу помощь!

Я хотел бы вывести все записи companyName, которые были загружены через любой из своих файлов server, как:

companies.companyName - количество (files.fileID) - сумма (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)

Каждая компания может иметь несколько кампаний.

Каждая кампания может иметь несколько файлов.

Каждый файл может иметь несколько файлов server

Запрос, который я пытался использовать, выглядит следующим образом:

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 - количество (files.fileID) - сумма (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 ]

2 голосов
/ 11 сентября 2009

Думаю, ваш запрос в порядке, за исключением предложения GROUP BY. Должно быть

GROUP BY companies.companyName
0 голосов
/ 10 сентября 2009

Добавьте название компании в группу и выполните 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;
...