我的情况是:已有表views,用到的字段是userid和viewtime。viewtime是DATE类型观看时间,如表中有viewtime记录说明这个userid在这个时间看过。希望实现的功能:如果一个userid某个记录前一个月内看过,则将这个记录标记为isactive。也就是说,一个userid对应的viewtime在之前的一个月内还有viewtime记录,则将这条的isactive标记为1,否则不标记。以下是我的SQL语句,思路就是每于每一条,拿出它的viewtime,在表中查有没有相同userid的记录,其usertime在前一个月内,如果有就将这一条标记为isactive:
UPDATE views set isactive=1 where viewtime IN( 
select viewtime from views b where b.viewtime IN 
(select viewtime from views a WHERE a.userid=b.userid 
AND b.viewtime BETWEEN DATE_ADD(a.viewtime, INTERVAL 1 DAY) AND DATE_ADD(a.viewtime, INTERVAL 1 MONTH)))很遗憾,以上语句通不过,好像是where子句中的表不能包含别名?求帮忙改一改

解决方案 »

  1.   

    先select下select * from  viewtime where exists
    (select 1 from views a, views b WHERE a.userid=b.userid 
    AND b.viewtime BETWEEN DATE_ADD(a.viewtime, INTERVAL 1 DAY) AND DATE_ADD(a.viewtime, INTERVAL 1 MONTH))
    看下对错再update
    UPDATE views set isactive=1 where  exists
    (select 1 from views a, views b WHERE a.userid=b.userid 
    AND b.viewtime BETWEEN DATE_ADD(a.viewtime, INTERVAL 1 DAY) AND DATE_ADD(a.viewtime, INTERVAL 1 MONTH))
      

  2.   

    select * from views c, (select b.userid,b.viewtime from views a, views b WHERE a.userid=b.userid 
    AND b.viewtime BETWEEN DATE_ADD(a.viewtime, INTERVAL 1 DAY) AND DATE_ADD(a.viewtime, INTERVAL 1 MONTH))t
    where c.userid=t..userid
    and c.viewtime=t.viewtime
    看下对错