有个bug管理系统,假如里面有两张表,一个名为bug,一个名为bug_history。
bug表中有两个字段,分别为:id,last_updated;id代表bug编号,一个bug一个编号,具有唯一性,last_updated字段代表该bug的最后更新日期
bug_history表中有三个字段,分别为id,bug_id,date_modified。这是个bug修订历史表,id代表修订顺编号,也具有唯一性;bug_id,就是bug编号,同bug表中的id,是具有对应关系的;date_modified是这次修订的提交日期。假设这两张表中记录如下:
bug表
id      last_updated
1       20130401
2       20130401
3       20130101
4       20130206bug_history表
id    bug_id     date_modified
1     1          20120103
2     1          20120104
3     1          20120106
4     2          20120502
5     2          20120503
6     2          20120506现在要实现的结果就是,用bug_history表每个bug_id的最大id号对应的date_modified字段内容,去更新bug表中对应id的last_updated值。
举例来说,bug_history表bug_id=1的最大id=3,然后id=3对应的date_modified是20120106,然后就用20120106去更新bug表中id=1的last_updated字段请问update语句如何写?
update (select id,last_updated from mantis_bug_table) as a,
(select bug_id,max(date_modified) as maxdate from mantis_bug_history_table group by bug_id) as b
set a.last_updated = b.maxdate
where a.id = b.bug_id and a.last_updated <> b.maxdate
这个是我写的,执行失败。

解决方案 »

  1.   

    UPDATE bug_history A 
    INNER JOIN bug C ON A.`bug_id`=C.`id`
    SET C.`last_updated`=A.`date_modified`
    WHERE NOT EXISTS(SELECT 1 FROM bug_history B WHERE A.`bug_id`=B.`bug_id` AND A.`id`<B.ID)
    ;
      

  2.   

    谢谢版主,问题解决了。但是我不懂,其中的意思。尤其是下面这段:
    WHERE NOT EXISTS(SELECT 1 FROM bug_history B WHERE A.`bug_id`=B.`bug_id` AND A.`id`<B.ID)这是一个怎样的过程,能说下嘛?
      

  3.   

    select * from bug_history a WHERE NOT EXISTS(SELECT 1 FROM bug_history B WHERE A.`bug_id`=B.`bug_id` AND A.`id`<B.ID)看看结果
      

  4.   

    我看到的结果是,正是我想要通过max聚集函数才能得到的结果。而现在通过这个exist语句居然也可以实现,但不知道这个内部过程是怎么走的。
      

  5.   

    A.`bug_id`=B.`bug_id` AND A.`id`<B.ID
    考虑一下这个条件
      

  6.   

    我似乎明白了,这应该是从虚拟表A中每次抽取出一条记录,然后同虚拟表B,进行逐条比较有没有更大的id,当比到最后,没有更大的id时,也就是A.`id`<B.id为假时,就找到了最大的id。
    不知道是不是这个意思?请版主明确。