我正在尝试使用多个连接构建MySQL查询,其中包含一些连接值。有3个表:客户,账户和存款。帐户和存款通过其customer_id字段加入客户。在查询结束时,所有客户都按其group_id进行分组:
SELECT customer.*,
COUNT(DISTINCT account.id) as account_count,
SUM(deposit.amount)/(COUNT(deposit.id)/COUNT(DISTINCT deposit.id)) as deposit_sum,
SUM(???) as deposit_first_sum
FROM customer
LEFT JOIN account ON account.customer_id = customer.id
LEFT JOIN deposit ON deposit.customer_id = customer.id
GROUP BY customer.group_id
问题是:联合行是重复的,而我必须进行一些分析:汇总所有存款金额 - 您可以在这里查看我的解决方法,以获取deposit_sum。但真正的问题是总结“客户首次存款”。在对结果进行分组之前,我们可能会发现有类似的内容:
... deposit.id deposit.customer_id deposit.amount
... 1 1 10
... 2 1 20
... 3 2 15
... 4 2 30
所以我需要的是只为每个customer_id(10 + 15)加上第一笔金额,即“deposit_first_sum”。
这里的一个限制是我害怕,我不能使用“左连接(SELECT ... FROM deposit)作为存款”,因为从存款表中获取所有存款行需要大量内存。
我在这里看到一个有趣的答案Sum values from one column if Index column is distinct? 但它适用于MSSQL。
所以问题是:有没有办法在不使用JOIN(SELECT)的情况下对所有首次存款求和,或者有一种方法可以使用JOIN(SELECT)但是有一些记忆经济技巧?
更新。 我们也可以使用与帐户表相关的deposit.account_id。
答案 0 :(得分:0)
此查询将为您首次存款提供customer_id
和amount
,而不使用子查询。
select d1.customer_id, d1.amount
from deposit d1
left join deposit d2
on d1.customer_id = d2.customer_id and d1.id > d2.id
where d2.id is null;
显然你也可以获得sum
:
select sum(d1.amount) total_first_deposit
from deposit d1
left join deposit d2
on d1.customer_id = d2.customer_id and d1.id > d2.id
where d2.id is null;
你也可以得到总和,以及这样的第一笔存款的总和:
select sum(d3.amount) total_deposit, sum(case when d3.id = d1.id then d3.amount end) total_first_deposit
from deposit d1
left join deposit d2
on d1.customer_id = d2.customer_id and d1.id > d2.id
inner join deposit d3
on d1.customer_id = d3.customer_id and d2.id is null