2014-09-30 116 views
0

從以前的文章中,我得到了我需要的幫助,但規範已經發生了一些變化,我仍然需要一些幫助。根據日期列從另一列更新sql列

我會盡量讓自己變得儘可能清楚。

我有兩個表,一個叫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 

我要做出驗證了該該表用戶的列2至表Users_status的日期一個cron 。表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 

欲用1個請求,來更新表的用戶的第二列(狀態)根據表中最新的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

是status_created_at日期數據類型? – Gervs 2014-09-30 10:39:19

+0

@Gervs datetime – Enjoyted 2014-09-30 10:40:53

回答

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 
+0

你可能會考慮使用AFTER INSERT觸發器 – Gervs 2014-09-30 10:54:59

+0

你是某種病態的SQL製造者,哈哈,它正在工作!你有沒有可能詳細說明你的答案,你是如何做到的?我真的很想聽到它 – Enjoyted 2014-09-30 11:28:04

0

比方說,我們要更新只有那些包含相同的多次入境記錄user_id and 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數據,那麼我可以檢查有

+0

鍵盤上沒有返回鍵嗎? – Gervs 2014-09-30 10:57:18

+0

@Gery,Aah ..對不起,你是對的..我只是寫快速查詢併發布..讓我格式化它。感謝您的建議 – 2014-09-30 11:04:01