使用基于日期列的其他列的值更新sql列

时间:2014-09-30 10:20:23

标签: mysql

从上一篇文章中,我得到了我需要的帮助,但规格有所改变,我仍需要一些帮助。

我会尽量让自己变得清晰。

我有两个表,一个名为Users,另一个名为Users_status。

表用户

column 1 : id (pk)
column 2 : status (fk)

表Users_status

column 1 : user_id (fk)
column 2 : user_status (fk)
column 3 : status_created_at

我想创建一个cron来验证表Users的第2列是否与表Users_status的最新版本相同。表USER_status可能有多次user_id重复,user_status递增,如下所示:

表Users_status

    user_id : 1
    user_status : 1
status_created_at : 14/09/14

    user_id : 1
    user_status : 2
status_created_at : 15/09/14

    user_id : 1
    user_status : 3
status_created_at : 16/09/14    

    user_id : 2
    user_status : 1
status_created_at : 14/09/14

    user_id : 2
    user_status : 2
status_created_at : 15/09/14

    user_id : 2
    user_status : 1 // see how user_status came back from 2 to 1
status_created_at : 16/09/14 // most recent status for user_id 2, what I want

我想要1个请求,根据表Users_status中存在的最新status_created_at来更新表的第二列Users(status)我也想要不更新已经处于良好状态的行(与表的状态相同) Users_status)

如何做到这一点? 当我只需要根据最高(MAX())user_status值更新第一个表时,我这样做了(感谢@Gervs):

UPDATE users
JOIN (SELECT
         user_id,
         MAX(status) status
      FROM
         users_status
      GROUP BY user_id
     ) st
ON users.id = st.user_id
SET users.status = st.status
WHERE users.status < st.status 

我真的很感激,如果有人能给我这方面的帮助,我认为这种请求对我来说有点过于复杂了:p

谢谢,

2 个答案:

答案 0 :(得分:1)

查询:

UPDATE users
JOIN (SELECT s.user_id,
          s.status
      FROM
          (SELECT
               user_id,
               MAX(status_created_at) status_created_at
           FROM
               users_status
           GROUP BY user_id) m
           JOIN
               user_status s USING (user_id, status_created_at)
           ) c
 SET users.status = c.status
 WHERE users.id = c.user_id 

答案 1 :(得分:0)

让我们说我们只想更新那些包含同一user_id和user_status的多个条目的记录 请尝试以下:

     update Users X ,
    (select a.user_id,a.user_status from (select user_id,user_status from users_status 
group by user_id,user_status having count(*)>1) a 
    inner join 
    (select user_id,user_status from 
    (select user_id,user_status from users_statys
order by status_created_at desc)temp 
group by user_id,user_status)b 
    on 
    a.user_id = b.user_id and a.user_status  = b.user_status) Y ,

 set X.status = Y.user_status where  X.id = Y.user_id; 

原谅错字:

如果你可以在sqlfiddle中添加数据,那么我可以在那里查看