本帖最后由 pamtry 于 2011-03-04 17:14:53 编辑

解决方案 »

  1.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  2.   

    你同一条B中的记录,虽然有对应的10条A中的记录,但 `countB` = `countB` - 1 时  `countB` - 1 是固定的,所以你看到的只是减了一次。
      

  3.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  4.   

    建立表CREATE TABLE IF NOT EXISTS `tasks` (
      `taskindex` int(11) unsigned NOT NULL,
      `starttime` datetime NOT NULL,
      `actcount` int(11) unsigned NOT NULL DEFAULT '0',
      `alive` int(10) unsigned NOT NULL DEFAULT '0',
    }
    INSERT INTO `tasks`(`taskindex`, `starttime`, `alive`) values
    (1, '2011-01-22 15:15:27', '1')
    (2, '2011-01-23 16:15:27', '2')
    (3, '2011-01-22 17:15:27', '2')
    CREATE TABLE IF NOT EXISTS `act` (
      `actindex` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `taskindex` int(11) unsigned NOT NULL,
      `content` tinytext COLLATE utf8_unicode_ci NOT NULL,
      `flag` enum('wait','pass','fail') COLLATE utf8_bin NOT NULL DEFAULT 'wait',
    }INSERT INTO `act`(`actindex`, `taskindex`, `content`) values
    (1, 1, '123')
    (2, 1, '23')
    (3, 1, 'adef')
    (4, 2, 'test')
    (5, 2, 'www')
    (6, 3, 'eeef')其中,act表每条insert都会在tasks表中队对应的计数项actcount进行+1递增而现在需要实现,根据ADDDATE(`starttime`, `alive`)来判断,act是否过期,如果过期,则`act`,`flag` = 'fail',并且在tasks表中把对应的actcount计数器-1我试过的是
    UPDATE `act` join (`tasks`) on (`tasks`.`taskindex` = `act`.`taskindex`) set `act`.`flag` = 'fail', `tasks`.`actcount` = `tasks`.`actcount` -1 where `act`.`flag` = 'wait' and now()<ADDDATE(`tasks`.`starttime`, `tasks`.`alive`)因为act和tasks为多对1,所以会出现同时update多个act,但是以上语句只对计数器-1的情况请问该如果修改,才能达到`actcount`正常计数
      

  5.   


    事务的话就是把单句拆成多句SQL,如果要实现我想要的这个功能,感觉多句SQL感觉还是很麻烦的继续求高手指点
      

  6.   

    楼主有自己测试过自己贴出的语句吗? 提问时也希望要负责一些,虽然您在CSDN上获得的帮助有是无偿免费的,但请不要浪费。
      

  7.   

    这一点,update与select有不同。
    当一对多连接时, select 行集会列出多条结果,如果select标量,同样只得会出一个值
    比如
    select a.*,b.* from a join b ...

    select a.*,(select b.... where ...) from a  若一对多,这种写法并不符合关系逻辑, 所以一般会是取聚合结果。
    而update时, 若一对多,因为countB为标量,则会使用一标量赋值, 因此,只会使连接产生的最后一个行的对应列去更新。