2012-09-14 57 views
1

如何在某个时间间隔之后更新表格,当条件匹配时?如何在特定时间间隔后更新表格

 
tb_contest 
id contest_id name is_expire 
1 101   new 0 
2 102   old 0 

tb_answer 
contest_id answer_id date 
101   1   2012-02-02 
101   2   2012-09-14 
102   5   2012-06-01 

我需要更新tb_contest某些条件得到满足后,使is_expire=1后2天的最后答案的基础上获得I:E 2012-03-14,所以tb_contest应该2012-09-16进行更新。

回答

0

试试这个,

UPDATE tb_contest a INNER JOIN 
     (
      SELECT contest_ID, MAX(`date`) maxDate 
      FROM tb_answer 
      GROUP BY contest_ID 
     ) b ON a.contest_ID = b.contest_ID 
SET a.is_expire = 1 
WHERE DATEDIFF(CURDATE(), b.maxDate) >= 2 AND 
     a.is_expire = 0 

所以在这里不言而喻,两个表被contest_ID加入并具有对tb_answer了最新的答复日期。通过使用DATEDIFF()我们可以知道今天的日期和比赛已经回答的日期之间的差异。

4

你可以使用MySQL的event scheduler

CREATE EVENT expire_contests 
    ON SCHEDULE EVERY DAY 
    STARTS CURRENT_DATE 
    DO UPDATE tb_contest JOIN (
     SELECT contest_id, MAX(date) AS latest 
     FROM  tb_answer 
     GROUP BY contest_id 
    ) t USING (contest_id) 
    SET tb_contest.is_expire = 1 
    WHERE tb_contest.is_expire <> 1 
     AND t.latest <= CURRENT_DATE - INTERVAL 2 DAY 
+0

非常感谢。 – syncdm2012

0

可以JOIN在回答表的较量和内部查询的UPDATE子句中,并使用MySQL的DATEDIFF,因为答案数数的天被回答为:

UPDATE 
    tb_contest c 
    JOIN (SELECT contest_id, MAX(date) AS date FROM tb_answer GROUP BY contest_id) AS a 
     ON a.contest_id = c.id 
SET 
    c.is_expire = 1 

WHERE 
    DATEDIFF(NOW(), a.date) >= 2 
+0

如果我必须为contest_id = 102做同样的事情,它也有多个条目 – syncdm2012

+0

@Mdharmendra在我的答案中的查询将更新任何/所有比赛有2天或更多天的“最后答案”;如果你想指定一个确切的比赛,你可以将'WHERE'子句改为'WHERE c.id = 102 AND DATEDIFF(NOW(),a.date)> = 2' – newfurniturey

相关问题