Mysql из суммы одного столбца таблицы вычитает сумму другого столбца таблицы - PullRequest
1 голос
/ 09 апреля 2020

Есть 2 таблицы. В обеих таблицах есть столбцы для точек и идентификатора пользователя. Хотите суммировать все баллы для конкретного пользователя в одной таблице, затем суммировать в другой и вычитать из общей суммы одной таблицы, общей суммы из другой таблицы. Имейте 2 решения (а также здесь http://sqlfiddle.com/#! 9 / f040a2 / 1 разместил мои тесты). Пожалуйста, совет, который лучше для производительности.

Первое решение. Очень ясно и кажется без "проблем"

SELECT 
( SELECT SUM(`PurchasedPoints`) FROM `first_table` WHERE `Id` = ? ) 
- 
( SELECT SUM(`SpendPoints`) FROM `second_table` WHERE `Id` = ? ) AS `RemainingPaidPoints`

Другое решение с LEFT JOIN. Где-то читал, что LEFT JOIN лучше по производительности, чем подзапросы. Но код выглядит сложным и не уверен, разумно ли его использовать.

SELECT SUM(`Ft`.`PurchasedPoints`) - `St`.`SpendPoints` AS `RemainingPaidPoints` 
FROM `first_table` `Ft` 

LEFT JOIN (
SELECT SUM(`SpendPoints`) AS `SpendPoints`, `Id` FROM `second_table` WHERE `Id` = ? 
GROUP BY `Id`
) `St` ON `Ft`.`Id` = `St`.`Id` 

WHERE `Ft`.`Id` = ? 

GROUP BY `Ft`.`Id` 

С обоими получаются одинаковые результаты, но ... что лучше для производительности и c., Пожалуйста?

1 Ответ

1 голос
/ 09 апреля 2020

JOIN работает с таблицами, подзапросы работают с наборами данных. Вот почему JOIN работает быстрее, чем подзапрос.

Однако в обоих запросах вы выполняете два отдельных запроса SELECT. Таким образом, с точки зрения производительности оба одинаковы. И, если вы рассчитываете суммирование определенного id, вам не нужно использовать GROUP BY.

SELECT SUM(`Ft`.`PurchasedPoints`) - SUM(`St`.`SpendPoints`) AS `RemainingPaidPoints` 
FROM `first_table` `Ft` 
LEFT JOIN `second_table` `St`
ON `Ft`.`Id` = `St`.`Id` 
WHERE `Ft`.`user_id` = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...