更新查询问题

时间:2011-05-25 15:33:01

标签: mysql

我在mysql数据库上有三个表:

  

RECHARGE 包含以下列:rid, uid ,res_id,agent_id,batch_id,rcard_order,serialno,email,   单位,bankid,paydate,slipno,rpin,amtpd,奖金,说明,   crSender,crSenderId,   transaction_ref,rechargeDate,   处理

     

SENT 包含以下列:sendid, uid ,res_id,收件人,音量,ffdaily,消息,发件人,msgtype,flash,mob_field ,wapurl,   日期

     

BILL 包含以下列:出价, uid ,电子邮件, unitBals ,lastusedate

问题是:我想要一个查询,它会从RECHARGE表中的单位中减去SENT表中音量的总和,并使用结果来更新 BILL 表格中的> unitBals 列,其中加入三个表格的主键是 uid

我使用了这个查询,但它没有给我相同的答案,就像我总和(音量)并从总和(单位)中减去它分别在我自己的计算中

update bill set unitbals = (SELECT sum( recharge.units ) - sum( sent.volume )
                            FROM sent, recharge
                            WHERE sent.uid = recharge.uid)
where email = 'info@dunmininu.com'

2 个答案:

答案 0 :(得分:1)

这里有两个问题。首先,从您使用sum的事实来看,我认为给定的Uid可以有多个Recharge记录,给定的Uid可以有多个Sent记录。如果这是真的,那么当你进行加入时,你没有得到所有的Recharges加上所有的Sents,你得到了Recharge和Sent的所有组合。

例如,假设对于给定的Uid,您有以下记录:

Recharge:
Uid  Units
42   2
42   3
42   4

Sent
Uid  Volume
42   1
42   6

然后是查询

select recharge.units, sent.volume
from recharge, sent
where recharge.uid=sent.uid

将给出

Units  Volume
2      1
2      6
3      1
3      6
4      1
4      6

所以做sum(单位)-sum(音量)将给出18-21 = -3。

此外,你没有做任何事情将发送和充值的Uid连接到账单的Uid。因此,对于任何给定的Bill,您正在处理所有uid的记录。法案的Uid从未被考虑过。

我认为你想要的更像是:

update bill
set unitbals = (SELECT sum( recharge.units ) from recharge where recharge.uid=bill.uid)
  - (select sum(sent.volume) from sent where sent.uid=bill.uid)
where email='info@dunmininu.com';

也就是说,取这个uid的所有充值总和减去所有sents的总和。

请注意,这会替换Unitbals的旧值。您也可以说“unitbals = unitbals +”等。

答案 1 :(得分:0)

我认为你需要在两个表中单独计算:

update bill
set unitbals =
    ( SELECT sum( recharge.units )
      FROM recharge
      WHERE bill.id = recharge.uid
    ) -
    ( SELECT sum( sent.volume )
      FROM sent
      WHERE bill.id = sent.id 
    ) 
where email = 'info@dunmininu.com'