现在做一个在线付费学习的系统,需要定时扣除用户应付款,我想写个存储过程,但是不知道如何写。具体是这样的:
表A中存储了用户的学习记录,及每次需要支付的金额
用户名       金额    日期时间
student1    30¥   yyyy-mm-dd H:i:s
student2    20¥   ...
student1    20¥   ...表B中是用户的信息,包括其可用金额
用户名       可用金额
student1   100¥
student2   400¥我要实现的功能就是根据表A的记录,在表B中扣除相应的应付款,比如说student1,需要扣除他30¥+20¥=50¥求教

解决方案 »

  1.   

    update b,(select 用户名,sum(金额) as sAmt from A group by 用户名) as c
    set b.可用金额=b可用金额-c.sAmt
    where b.用户名=c.用户名;
      

  2.   

    update b
    set b.可用金额=b.可用金额-t.金额
    from (select 用户名,sum(金额) as 金额 from A group by 用户名) t
    where b.用户名=t.用户名这里统计A表的金额应该加个时间条件,或者在A表加个是否已扣款的标识,防止重复扣款
      

  3.   

    谢谢两位
    josy说的很对,A表是有一个是否已扣款的标识,我忘记讲了,怎么在扣款的同时(楼上两位写的sql语句)更改这个标识呢(比如从0改成1)?
      

  4.   

    begin transactionupdate b
    set b.可用金额=b.可用金额-t.金额
    from (select 用户名,sum(金额) as 金额 from A group by 用户名) t
    where b.用户名=t.用户名update a set 扣款标识=1if @@ERROR <> 0 ROLLBACK TRANSACTION
    COMMIT TRANSACTION加个事务保证修改扣款标识不成功时,不扣款
      

  5.   

    START TRANSACTION;
    update test.b set course='english';
    update test.b set score='ss';
    if @@ERROR <> 0 ROLLBACK;
    COMMIT;
    josy,上面这个是我做的测试,第二个update语句是会出错的,我在Mysql Administrator里执行,第一个update语句还是把数据给更新了。在命令行执行的时候报"if @@ERROR"附近语法错误。求教
      

  6.   

    update语句本身没有错误
    if语句出现错误了。
    好好看看语法吧。
      

  7.   

    START TRANSACTION;update test.b set course='english';
    update test.b set score='ss';IF @@ERROR <> 0 
    BEGIN 
    ROLLBACK TRANSACTION; 
    END 
    COMMIT TRANSACTION; 
    这样呢?
      

  8.   

    还是不行,和原来是一样的。
    我把这段放到procedure里,
    CREATE PROCEDURE `test`.`t_test` ()
    BEGIN
            START TRANSACTION;        update test.b set course='english';
            update test.b set score='ss';        IF @@ERROR <> 0
            BEGIN
            ROLLBACK;
            END
            COMMIT;
    END
    创建的时候说ERROR不是正确的系统变量(Unknown system variable 'ERROR')
      

  9.   

    不好意思,可能是sqlserver的语法看多了,到网上看了一下,mysql据说直接用以下方法就可以
    请测试一下
    CREATE PROCEDURE `test`.`t_test` ()
    BEGIN
            START TRANSACTION;        update test.b set course='english';
            update test.b set score='ss';        ROLLBACK;END
      

  10.   

    还是搞不定
    START TRANSACTION;        update test.b set course='english';
            update test.b set score='ss';        ROLLBACK;
    这样的时候,我call t_test()的时候报第二个update有错(因为‘ss’类型和列类型不符),第一个update无效。但是我把score的值改了以后:
    START TRANSACTION;        update test.b set course='english';
            update test.b set score='50';        ROLLBACK;这样的话不出错,但是第一个update成功了,第二个没效果。
      

  11.   

    START TRANSACTION;update test.b set course='english';
    update test.b set score='ss';COMMIT;
    这样就可以了