使用MysQL JOIN进行DISTINCT SUM

时间:2014-11-13 07:28:32

标签: mysql sum aggregate

我有两个表tableA和tableB。

tableA
-------
ID  sid     amount

1   swerdd  20    
2   swerdd  30    
3   fdff    40

tableB
------

new_id  token    date

10      swerdd  2014 -10-12    
11      swerdd  2014 -10-13    
12      swerdd  2014 -10-13

现在我使用查询

SELECT * FROM tableA JOIN tableB on tableA.sid = tableB.token 

给出了多行,所以我的其他查询

SELECT SUM(amount) FROM tableA JOIN tableB on tableA.sid = tableB.token 

给出了错误的结果。如何选择DISTINCT SUM?

编辑:事情是我在这里有很多关系,因为sid和令牌正在重复。所以简而言之,问题是我如何计算多对多连接中的不同总和

3 个答案:

答案 0 :(得分:1)

一些不涉及加入操作的方法......

EXISTS谓语......

SELECT SUM(a.reward_amount) 
  FROM tableA a
 WHERE EXISTS (SELECT 1 FROM tableB b WHERE b.token = a.sid) 

IN (subquery)谓语......

SELECT SUM(a.reward_amount) 
  FROM tableA a
 WHERE a.sid IN (SELECT b.token FROM tableB b)

对于连接操作,一个选项是使用内联视图来获取令牌的不同列表...

SELECT SUM(a.reward_amount)
  FROM tableA a
  JOIN ( SELECT b.token
           FROM tableB b
          GROUP BY b.token
       ) c
    ON c.token = a.sid

答案 1 :(得分:0)

要获得不同的金额,您可以使用以下查询

SELECT reward_amount
FROM tableA 
     JOIN tableB on tableA.sid = tableB.token
GROUP BY reward_amount;

答案 2 :(得分:-1)

为了在一组记录上执行aggegations(SUM,COUNT,AVG,...),您需要一个GROUP BY子句。

SELECT SUM(amount) 
FROM tableA
WHERE sid IN (SELECT token FROM tableB)
GROUP BY sid

如果您有兴趣深化有关数据分组的SQL知识,可以查看:http://www.techonthenet.com/sql/group_by.php