4 объединение таблиц таким образом, чтобы для каждой компании выдавался только 1 ответ вместо результата для каждой кампании
Вопрос
Спасибо за вашу помощь!
Я хотел бы вывести все записи CompanyName, которые загружаются в любой из их серверных файлов, как:
companies.CompanyName - количество (файлов.fileID) - сумма (serverFiles.uniqueUploads)
Initech Ltd. - 11 - 24931
Epiphyte Inc. - 23 - 938821
Вот соответствующие части моей структуры таблицы:
Таблица:компании
companyID (INT) - companyName (TEXT)
Таблица:кампании
campaignID(INT) - companyID (INT)
Таблица:Файлы
fileID (INT) - campaignID (INT)
Таблица:Серверные файлы serverFileID (INT) - Файловый идентификатор (INT) - Уникальные загрузки(INT)
У каждой компании может быть несколько кампаний.
Каждая кампания может содержать несколько файлов.
Каждый файл может содержать несколько серверных файлов
Запрос, который я пытался использовать, выглядит следующим образом:
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 - количество (файлов.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)
Как мне изменить запрос, чтобы он выдавал мне только один ответ для каждой компании, суммируя все кампании в рамках этой компании?
Большое спасибо за любую помощь.
Решение
Я думаю, ваш запрос в порядке, за исключением предложения GROUP BY .Должно быть
GROUP BY companies.companyName
Другие советы
Добавьте название компании в группу и выполните МИНИМАЛЬНОЕ / МАКСИМАЛЬНОЕ действие, чтобы выбрать одну из них в списке выбора.
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;