2011-08-07 36 views
2

我有兩個表:項目和ItemHistory與一對多的關係。如何使用基於mySQL中最新一行子表的值更新列?

我想扁平化'item'表並添加:dtLastUpdated和nLastUpdatedByUserID列,但我需要升級表數據。

項目
的NID
dtCreated
dtLastUpdated(新列)
nLastUpdatedByUserID(新列)

ItemHistory
的NID
nItemID
dtUpdated
nUpdatedByUserID

有人可以幫助我創建一個更新語句來做到這一點。我嘗試過很多在mySQL中不合法的東西,所以有點卡住了。例如...

UPDATE Item 
INNER JOIN ItemHistory ON ItemHistory.nItemID=Item.nID 
SET Item.dtLastUpdated = ItemHistory.dtUpdated, 
    Item.nLastUpdatedByUserID = ItemHistory.nUpdatedByUserID 
ORDER BY ItemHistory.dtUpdated DESC 

這是mySQL 5.5安裝所必需的。

感謝

回答

1
update Item as I 
inner join (select IH.nItemID, 
        IH.dtUpdated, 
        IH.nUpdatedByUserID 
      from ItemHistory as IH 
      inner join (select nItemID, 
           max(dtUpdated) as dtUpdated 
         from ItemHistory 
         group by nItemID) as IHLast 
      on IH.nItemID = IHLast.nItemID and 
       IH.dtUpdated = IHLast.dtUpdated) as IH 
on IH.nItemID = I.nID 
set 
    I.dtLastUpdated = IH.dtUpdated, 
    I.nLastUpdatedByUserID = IH.nUpdatedByUserID; 

最裏面的查詢獲取nItemIDmax(dtUpdated)將被加回到ItemHistory以獲得nUpdatedByUserID用於其中max(dtUpdated) = dtUpdated。在MySQL中可能有其他更好的方法,但這種方式可以按預期工作。

0

丹,你的發言永遠不會工作,因爲你正在更新中甚至不存在的項目表中的列。

根據你的說法,Item表只有nID,dtCreated,但是你正在對Item表中不存在的「dtLastUpdated」列進行更新。與nLastUpdatedByUserID相似。

見你在這裏的講話:

UPDATE Item INNER JOIN ItemHistory ON ItemHistory.nItemID=Item.nID 
SET Item.dtLastUpdated=ItemHistory.dtUpdated, 
Item.nLastUpdatedByUserID=ItemHistory.nUpdatedByUserID 
ORDER BY ItemHistory.dtUpdated DESC 

您需要首先在項目表中創建這些列:Here's the reference manual做這件事在MySQL。問候。

編輯:讀您的評論後,我糾正你的SQL statment(這似乎是在MySQL的語法做與內部連接更新):

UPDATE from Item as I inner join ItemHistory as IH ON IH.nItemID=I.nID 
SET I.dtLastUpdated=IH.dtUpdated, 
I.nLastUpdatedByUserID=IH.nUpdatedByUserID 
+0

是的,這是原來的表;我繼續說:「我想稍微放平'item'表並添加:dtLastUpdated和nLastUpdatedByUserID列,但我需要升級表數據。」 – Dan

+0

我已重新回答了這個問題,以避免將來出現任何含糊之處 – Dan

+0

@Dan檢查我的編輯。根據我在網上找到的一些MySQL文檔,這應該是正確的語法。 – Icarus

相關問題