正确使用HAVING子句

时间:2013-02-27 23:14:31

标签: mysql having-clause

我正在使用MySQL,我的目标是UPDATE只有满足特定条件的表中的字段。这就是我所拥有的:

UPDATE tbl_money AS m 
SET m.amount = m.amount + (SELECT SUM( b.bn_ppd )
                           FROM tbl_emp AS e
                           LEFT JOIN tbl_bonuses AS b 
                              ON b.bn_id = e.bn_id
                           WHERE m.u_id = e.u_id
                           HAVING COUNT(e.u_id) > 0
                           GROUP BY e.u_id LIMIT 1)

有了上述内容,我想在当前金额中加上员工所拥有的奖金总额,并且仅添加到tbl_emp中存在的员工。实际上,我收到一条错误消息:

  

1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便在#BY; GROUP BY附近使用正确的语法o.user_id LIMIT 1)'在第7行

如果没有HAVING条款,系统会更新所有员工的金额,但是那些没有任何奖金的人,只需将金额重置为0(即使他们已经有金额)。对于那些有奖金的人,工作正常。

有什么想法吗?使用HAVING的正确方法是什么?

更新:

tbl_bonuses
-----------
bn_id | bn_ppd
1       5
2       2
3       4
4       10

tbl_emp
-------
emp_id | u_id | bn_id | ...
1       30      2
2       30      3
3       31      1

tbl_money
---------
m_id | u_id | amount
1      30     100
2      31     56
3      32     35

更新后,所需的结果应为

    tbl_money
    ---------
    m_id | u_id | amount
    1      30     106
    2      31     57
    3      32     35

但是,我得到了这个结果,

    tbl_money
    ---------
    m_id | u_id | amount
    1      30     106
    2      31     57
    3      32     0

2 个答案:

答案 0 :(得分:2)

HAVING需要追踪GROUP BY子句

答案 1 :(得分:0)

您可以使用以下UPDATE声明:

update tbl_money m
INNER JOIN
(
  SELECT e.u_id, SUM( b.bn_ppd ) BonusPaid
  FROM tbl_emp AS e
  LEFT JOIN tbl_bonuses AS b 
    ON b.bn_id = e.bn_id
  GROUP BY e.u_id
  HAVING COUNT(e.u_id) > 0
) e
  on m.u_id = e.u_id
set m.amount = m.amount + e.BonusPaid

请参阅SQL Fiddle with Demo

相关问题