簡體   English   中英

如何使用基於mySQL中子表的最新行的值更新列?

[英]How do I update a column with a value based on the latest row of a child table in mySQL?

我有兩個表:具有一對多關系的Item和ItemHistory。

我想稍微展平'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安裝是必需的。

謝謝

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中可能有其他/更好的方法來完成此操作,但此方法可以按預期工作。

丹,您的聲明永遠不會起作用,因為您正在更新甚至不存在的項目表中的列。

根據您的說法,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

您需要首先在Item表中創建這些列: 是在MySQL中進行操作的參考手冊 問候。

編輯 :閱讀您的評論后,我正在更正您的sql語句(這似乎是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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM