У меня есть таблица с именем Проекты, которые имеют следующие соотношения:Какой самый эффективный запрос?
имеет много взносов имеют много платежей
В моем наборе результатов, мне нужно следующие агрегированных значения:
- Количество уникального (Донордид в таблице взносов)
- Всего внесенных взносов (СУММ таблицы «Сумма на вклад»)
- Всего уплаченных (СУММЫ Paym enAmount on Payment)
Поскольку существует так много совокупных функций и множественных объединений, он становится беспорядочным, поэтому используйте стандартные агрегатные функции в предложении GROUP BY. Мне также нужна возможность сортировки и фильтрации этих полей. Так что я придумал два варианта:
Использование подзапросов:
SELECT Project.ID AS PROJECT_ID,
(SELECT SUM(PaymentAmount) FROM Payment WHERE ProjectID = PROJECT_ID) AS TotalPaidBack,
(SELECT COUNT(DISTINCT DonorID) FROM Contribution WHERE RecipientID = PROJECT_ID) AS ContributorCount,
(SELECT SUM(Amount) FROM Contribution WHERE RecipientID = PROJECT_ID) AS TotalReceived
FROM Project;
Использование временной таблицы:
DROP TABLE IF EXISTS Project_Temp;
CREATE TEMPORARY TABLE Project_Temp (project_id INT NOT NULL, total_payments INT, total_donors INT, total_received INT, PRIMARY KEY(project_id)) ENGINE=MEMORY;
INSERT INTO Project_Temp (project_id,total_payments)
SELECT `Project`.ID, IFNULL(SUM(PaymentAmount),0) FROM `Project` LEFT JOIN `Payment` ON ProjectID = `Project`.ID GROUP BY 1;
INSERT INTO Project_Temp (project_id,total_donors,total_received)
SELECT `Project`.ID, IFNULL(COUNT(DISTINCT DonorID),0), IFNULL(SUM(Amount),0) FROM `Project` LEFT JOIN `Contribution` ON RecipientID = `Project`.ID GROUP BY 1
ON DUPLICATE KEY UPDATE total_donors = VALUES(total_donors), total_received = VALUES(total_received);
SELECT * FROM Project_Temp;
Тесты для обоих довольно сопоставимы, в размере 0,7 - 0,8 секунды в диапазоне с 1000 рядами. Но я действительно обеспокоен масштабируемостью, и я не хочу, чтобы меня перестраивали все по мере роста моих таблиц. Какой лучший подход?
Благодарим за отзыв. К сожалению, одно из требований заключается в том, что все эти данные отправляются на карту, содержащую мир всех проектов, поэтому разбиение на страницы недостаточно. Предполагая, что это не было требованием, на странице должно быть 16 проектов. Считаете ли вы, что не стоит делать все это и вместо этого запускать 3 или 4 простых запроса для каждого результата? Это 64 запроса на страницу, но если они простые, может быть, это тривиально? –