【问题标题】:How to update table after a certain time interval如何在一定时间间隔后更新表
【发布时间】:2012-09-14 09:32:23
【问题描述】:

当条件匹配时,如何在一段时间间隔后更新表?

tb_contest id 竞赛_id 名称 is_expire 1 101 新 0 2 102 旧 0 tb_answer 比赛编号 answer_id 日期 101 1 2012-02-02 101 2 2012-09-14 102 5 2012-06-01

我需要在满足某些条件后更新tb_contest,并根据收到的最后一个答案 i:e 2012-03-14 在 2 天后生成is_expire=1,因此tb_contest 应该在2012-09-16 上更新。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个,

    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(),我们可以知道今天的日期和比赛被回答的日期之间的差异。

    【讨论】:

      【解决方案2】:

      你可以使用 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
      

      【讨论】:

        【解决方案3】:

        您可以在UPDATE 子句中JOIN 比赛和答案表上的内部查询,并使用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
        

        【讨论】:

        • 如果我必须为同样有多个条目的竞赛 ID=102 做同样的事情
        • @Mdharmendra 我的答案中的查询将更新任何/所有具有 2 天或更长时间前“最后答案”的比赛;如果要指定确切的比赛,可以将WHERE 子句更改为WHERE c.id = 102 AND DATEDIFF(NOW(), a.date) &gt;= 2
        猜你喜欢
        • 2017-05-10
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 2015-05-30
        • 1970-01-01
        相关资源
        最近更新 更多