繁体   English   中英

使用基于日期列的另一列中的值更新sql列

[英]UPDATE sql column with value from another column based on a date column

在上一篇文章中,我已经获得了需要的帮助,但是规格有所变化,我仍然需要一些帮助。

我会尽力使自己尽可能清楚。

我有两个表,一个叫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的最新内容。 表Users_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

我想要一个请求,根据表Users_status中存在的最新status_created_at更新表Users(状态)的第二列,我也不想更新已经具有良好状态(与表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

谢谢,

带有查询:

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 

假设我们只想更新那些包含相同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中添加数据,那么我可以检查一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM