Как избежать вычисления строк, вызванных соединением внутри SUM()?

#mysql #sql #join

Вопрос:

Вот упрощенная схема моей базы данных:

 // wallet
 ---- -------- --------- 
| id | credit | user_id |
 ---- -------- --------- 
| 1  | 1000   | 1       |
| 2  | 1500   | 2       |
 ---- -------- --------- 

// where_to_pay_ability
 ---- ------------- ----------- 
| id | business_id | wallet_id |
 ---- ------------- ----------- 
| 1  | 5           | 1         |
| 2  | 4           | 1         |
 ---- ------------- ----------- 
 

И это текущий запрос, который у меня есть:

 select sum(credit)
from wallet w 
left join where_to_pay_ability wtpa on w.id = wtpa.wallet_id
where user_id = 1
 

Это возвращается . 2000 Потому что внутри таблицы есть две строки where_to_pay_ability . Это неверная оценка для меня. Я хочу, чтобы sum строки один раз попали в wallet таблицу. Итак, ожидаемый результат таков 1000 .

Как я могу это сделать?


Следует отметить, что я могу сделать это left join с помощью подзапроса, который является GROUP BY ed wallet_id (Или DISTINCT ). Но мне нужно, чтобы у меня были эти business_id буквы.

Итак, мне нужно условие внутри SUM() , чтобы избежать вычисления строк, вызванных соединением.

Комментарии:

1. Почему JOIN бы все-таки не удалить его, если у вас нет доступа к каким-либо данным из другой таблицы?

2. Ну, @NicoHaase, как я уже сказал, это упрощенная версия того, что я хочу .. на самом деле мне нужно выбрать все столбцы из таблицы wallet и. where_to_pay_ability

Ответ №1:

Вам нужно будет собрать данные перед присоединением:

 select sum(credit)
from wallet w left join
     (select wtpa.wallet_id, count(*) as cnt
      from where_to_pay_ability wtpa
      group by wtpa.wallet_id
     ) wtpa
     on w.id = wtpa.wallet_id;
 where user_id = 1;
 

Однако в вашем конкретном примере вы могли бы использовать max() , потому что есть только одна строка.