【问题标题】:Update with JOIN from another table and get the most recent使用另一个表中的 JOIN 进行更新并获取最新的
【发布时间】:2014-03-17 01:21:15
【问题描述】:

我有一个user 表与log 表的一对多关系。

本质上,每次更新用户记录时,都会在日志表中插入一条记录。

现在我想做的是用最新的日志条目更新用户表,将他们的当前状态和注释字段设置为最近记录的。

日志
id
user_id
status
notes
datetime

用户
身份证
状态
笔记


以下查询几乎可以正常工作,只是它获取日志表中的第一个条目。

UPDATE user u 
INNER JOIN log l 
ON u.user_id = l.user_id
SET u.`status` = l.`status`, u.notes = l.notes

我希望它获得最新的,无论是基于 datetime 字段还是仅仅基于最大值 id

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 UPDATE 语句的 WHERE 子句中选择 MAX(id),如下所示:

    UPDATE 
        u 
    SET 
        u.status = l.status, 
        u.notes = l.notes
    FROM 
       user u
       INNER JOIN log l ON u.user_id = l.user_id
    WHERE 
       l.id = (
           SELECT
               MAX(id)
           FROM 
               log
           WHERE
               user_id = u.user_id);
    

    【讨论】:

      【解决方案2】:

      您需要手动查找最后一条记录。一个很好的方法是使用not exists:

      UPDATE user u INNER JOIN
             log l 
             ON u.user_id = l.user_id
          SET u.`status` = l.`status`, u.notes = l.notes
          WHERE not exists (select 1
                            from log l2
                            where l2.user_id = l.user_id and
                                  l2.datetime > l.datetime
                           );
      

      这对于log(user_id, datetime) 上的索引最有效。

      【讨论】:

        【解决方案3】:

        试试这个:

        UPDATE user u INNER JOIN log l INNER JOIN 
        (SELECT MAX(id) Last_id FROM log GROUP BY user_id) u on u.Last_id=l.id
        on l.user_id=u.user_id
        SET u.`status` = l.`status`, u.notes = l.notes
        

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多