1

我正在使用 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 服务器版本相对应的手册,以在第 7 行的“GROUP BY o.user_id LIMIT 1)”附近使用正确的语法

如果没有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
4

2 回答 2

2

HAVING 需要在 GROUP BY 子句之后

于 2013-02-27T23:16:57.673 回答
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

于 2013-02-28T01:30:06.090 回答