在加入表之前使用聚合函数

时间:2019-04-20 08:07:08

标签: mysql sql codeigniter join aggregate

我有两个表,并在customer_id上加入它们。

第一个表是交易,我在其中存储交易的数据。而且每笔交易都有交易额和休息额,支付额等等。

第二个表是handle,对我来说很难解释该表的用途,但是handle表是同一交易表,并且具有volume_handle,rest_handle,pay_handle等。

我必须使用左联接,因为我想要交易表中的所有记录以及句柄表中的匹配记录

我要对交易量和交易余量求和,对交易柄的volume_handle求和,这些表之间的关系是customer_id和buy_id。

例如交易表:

import 'dart:convert' show json;
import 'package:shared_preferences/shared_preferences.dart';

void setList(
    String key, List<dynamic> value) async {
  await setString(key, json.encode(value));
}


setList('key', []);

并且句柄表是:

id = 1
volume = 1000
rest = 1000
customer_id = 1
---------------
id = 2
volume = 500
rest = 0
customer_id = 1
---------------
id = 3 
volume = 2000
rest = 0
customer_id = 2

我写的查询是:

id = 1
volume_handle = 3000
buy_id = 1

,此查询的结果是:

select sum(deal.rest) as rest , sum(deal.volume) as volume , sum(handle.volume_handle) as handle  
from deal 
left join handle on deal.customer_id = handle.buy_id  
group by deal.customer_id;

音量和其余部分都正确,但是第二个表的句柄是错误的,因为sum(handle.volume_handle)的结果是3000而不是6000(当customer_id为1时)

而且我不知道在连接表之前如何使用聚合函数。

这里的任何人都可以为此问题写查询吗?

1 个答案:

答案 0 :(得分:2)

由于每个handle值在deal.customer_id中可以有多行,因此您需要先在该表中执行汇总,然后再将JOIN汇总到{{ 1}}。像这样:

deal

输出:

SELECT d.customer_id,
       SUM(d.rest) AS rest,
       SUM(d.volume) AS volume,
       MAX(h.volume_handle) AS handle
FROM deal d
LEFT JOIN (SELECT buy_id, SUM(volume_handle) AS volume_handle
           FROM handle
           GROUP BY buy_id) h ON h.buy_id = d.customer_id
GROUP BY d.customer_id

Demo on dbfiddle

请注意,我在customer_id rest volume handle 1 1000 1500 3000 2 0 2000 null 附近使用了MAX,这不会改变结果(因为它将测试的所有值都相同),但是必须避免使用任何{{1 }}错误。