从上一篇文章中,我得到了我需要的帮助,但规格有所改变,我仍需要一些帮助。
我会尽量让自己变得清晰。
我有两个表,一个名为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
谢谢,
答案 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中添加数据,那么我可以在那里查看