有两个表:a 和 b表a结构:                         
name email gender nirc mobile     
xx   xxx   x      xxx   xx表b是一个临时表,结构与表a相同。我现在需要根据临时表b中的数据来更新表a,有三个关联条件字段:email,nirc和mobile,
按这三个字段的顺序来更新表a,
mysql语句如下:
1.update a join b on a.email = b.email 
  set a.(除了email字段之外的字段) = b.(除了email字段之外的字段)2.update a join b on a.nirc= b.nirc
  set a.(除了nirc字段之外的字段) = b.(除了nirc字段之外的字段)3.update a join b on a.mobile= b.mobile
  set a.(除了mobile字段之外的字段) = b.(除了mobile字段之外的字段)上面的语句是简写,程序里我是用循环一个一个字段的更新的(语句写得很烂,可以执行就ok,有好的语句请不吝赐教!)。更新完成后,我想获得表a被更新的记录的条数,但出现了一点问题,
本来我是想在每一个更新语句执行完成后,用mysql_affected_rows()来取影响的行数,
然后把这个些行数都记录下来,累加起来当作表a被更新记录的条数,
可是我发现有时候表a中一条记录可能有多个字段被更新,这样一来每更新一个字段就当做一个被更新的记录被累加了,
结果导致我上面累加的做法并不能反映表a实际上被更新的记录数。部分代码如下://放的是除了mobile字段之外的字段
$temparr=array(“name”,“email”,“gender”,“nirc”);
 
//遍历字段数组,执行更新操作
foreach($temparr as $value)
{
$q='update a join b on a.mobile= b.mobile
    set a.'.$value.' = b.'.$value.' 
    where b.'.$value.' is not null';
 $result=mysql_query($q); //记录更新记录条数
 $updatenum+=mysql_affected_rows();   
}
各位大侠帮帮忙,怎么样才能正确的取得更新记录的条数呢?

解决方案 »

  1.   


    -- 创建一个表用来记录A表被更新次数
    create table Update_table(Update_times int);
    -- 在A表建一个触发器,每更新一次,记录加1
    CREATE TRIGGER trig_update after update ON a
      FOR EACH ROW BEGIN
        update Update_table set Update_times=Update_times+1;
      END;
      

  2.   

    可是我发现有时候表a中一条记录可能有多个字段被更新,这样一来每更新一个字段就当做一个被更新的记录被累加了,
    结果导致我上面累加的做法并不能反映表a实际上被更新的记录数。从你这段话的描述来看,是要所有字段都进行了修改,才算修改一次。那1楼的方法不行。
    提供个思路
    1:创建一个A表的克隆表A1,写入A的同时也写入A1,这个可以用触发器做到
    2:查询的时候可以这样
    select count(*) from a,a1 where a.id<>a1.id and a.name<>a1.name .....
    枚举出所有字段,得到的这个COUNT就是每个字段都进行了修改了的条数。但这样又存在一个问题,如果我把A.ID从1修改成2,然后又修改成1了,这样的这个ID算是修改过的,还是未修改的?
      

  3.   

    谢谢你的思路~不过好像我说得不够清楚,在详细点吧。
    比如说表b里是这样:
    name email      gender   nirc  mobile   
    kk   [email protected]  Male    S178  15945545876
    dd   [email protected]  Female  S546  15945534567表a里是这样:
    name email      gender  nirc  mobile   
    kk   [email protected]  Male   S123  15945545876
    dd   [email protected]  Male   S546  15945534567按我的方法来用表b更新表a,就会得出有三条记录被更新,而实际上只是两条记录被更新。我想的是能不能每一次更新时,能取到被更新的行的id,记录下来,这样到最后把id重复的算做一个,再计算一下有id总数,就是实际上被更新的记录了。。需要用什么方法实现呢?
      

  4.   

    但这样又存在一个问题,如果我把A.ID从1修改成2,然后又修改成1了,这样的这个ID算是修改过的,还是未修改的?------------------------------------------------------------------------------------
    我想的是能不能每一次更新时,能取到被更新的行的id,记录下来,这样到最后把id重复的算做一个,再计算一下有id总数,就是实际上被更新的记录了。。需要用什么方法实现呢?你这个想法下,不能解决我说的这个问题
      

  5.   

    但这样又存在一个问题,如果我把A.ID从1修改成2,然后又修改成1了,这样的这个ID算是修改过的,还是未修改的?------------------------------------------------------------------------------------
    这样的应该算改过的,只不过改了两次嘛。这个问题已经解决了,我在更新前就把需要做更新的记录的id都记录下来,以id的值为索引存入数组中,这样根据数组索引唯一的特性就能解决重复问题,当更新语句全部执行完成后,我在取这个数组里元素的个数,
    即得到实际上被更新的记录的条数了。结贴了,非常谢谢你~无以为报,只能给分了,不要嫌少啊!呵呵。。