#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()
, потому что есть только одна строка.