【问题标题】:Mysql Join AND SUMMysql 加入和求和
【发布时间】:2011-10-29 18:15:22
【问题描述】:

请看这张图

http://i.stack.imgur.com/A2RB2.jpg

我想得到

  1. 桌子上的钱来了
  2. 请假总金额
  3. 使用 id 内部连接 ​​emp

这是我的问题

SELECT uid,SUM(money) FROM come 
INNER JOIN emp ON(come.uid = emp.id) 
WHERE emp.statue=1 
GROUP BY come.uid 
UNION 
SELECT uid,SUM(money) FROM `leave` 
INNER JOIN emp ON ( leave.uid = emp.id ) 
GROUP BY leave.uid 

结果就是这张图片

http://i.stack.imgur.com/xZtO3.jpg

【问题讨论】:

  • 我会使用 UNION ALL 而不是 UNION(应该更快,因为它不需要排序)
  • @Kevin,UNION 不会排序,它会删除重复的行(所以 UNION ALL 应该更快,但出于不同的原因 ^_^)
  • @jswolf19 我承认它可能不会,但有时会:dev.mysql.com/doc/refman/5.5/en/index-merge-sort-union.html 我想唯一可以确定的方法是检查你的执行计划。

标签: mysql join sum


【解决方案1】:

另一种方法(未经测试,如果它爆炸了,请告诉我):

SELECT emp.id, IF(emp.statue=1, c.sumCome, 0) AS sumCome, l.sumLeave
FROM emp
     LEFT JOIN (SELECT uid, SUM(money) AS sumCome
                FROM come
                GROUP BY uid
               ) c ON emp.id = c.uid
     LEFT JOIN (SELECT uid, SUM(money) AS sumLeave
                FROM leave
                GROUP BY uid
               ) l ON emp.id = l.uid

我不知道哪个会比 Kevin 的更快。你可能想explain他们俩看看。

【讨论】:

  • 你的查询很完美,你能告诉我关于这个查询的信息解释一下吗:)
  • @samarlover,我需要从哪里开始解释?你知道join 是什么吗? left join?子查询?你了解if函数吗?
【解决方案2】:

我们开始:

SELECT q1.uid,SUM(q1.l),SUM(q1.c) FROM
(
SELECT uid,0 as l,SUM(money) as c FROM come 
INNER JOIN emp ON (come.uid = emp.id) 
WHERE emp.statue=1 GROUP BY come.uid 
UNION ALL 
SELECT uid,SUM(money) as l,0 as c FROM leave
INNER JOIN emp ON ( leave.uid = emp.id ) GROUP BY leave.uid 
) q1
GROUP BY uid

【讨论】:

  • 谢谢你的回答结果是#1248 - 每个派生表都必须有自己的别名
【解决方案3】:

试试这个

   select uid,sum(ComeTot),sum(LeaveTot)
   from
  (

    SELECT uid,SUM(money) as ComeTot ,0 as LeaveTot
    FROM come 
    INNER JOIN emp ON(come.uid = emp.id) WHERE emp.statue=1 
    GROUP BY come.uid 
    UNION 
    SELECT uid,0 ,SUM(money) FROM leave
    INNER JOIN emp ON ( leave.uid = emp.id ) 
    GROUP BY leave.uid
  ) xx

GROUP BY xx.uid

我没有在这台 PC 上安装 mySQL,但这应该会让你很接近。根据上述结果,您可能需要将上面的整个查询包装在另一个组中...

【讨论】:

  • 你的查询很好,但没有得到答案,但它让我看看这张照片http://i.stack.imgur.com/adfVb.jpg
  • 我调整了查询​​,应该可以满足您的需要,但由于我没有安装 mySQL,因此未经过测试
猜你喜欢
  • 2021-03-21
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2011-07-14
  • 2021-12-31
相关资源
最近更新 更多