2014-02-10 76 views
1

插入外鍵的計數更新的表我有兩個表:從其他表

╔════════════════╗ ╔════════════════╗ 
    ║ ITEM   ║ ║ ITEM_TRACK  ║ 
    ╠════════════════╣ ╠════════════════╣ 
    ║ ID    ║ ║ ID    ║ 
    ║ GUID   ║ ║ ITEM_GUID  ║ 
    ║ COUNT1   ║ ║ CONTEXT  ║ 
    ║ ENDDATE  ║ ║    ║ 
    ╚════════════════╝ ╚════════════════╝ 

╔═════╦══════╦════════╗ ╔═════╦═══════════╦══════════╗ 
║ ID ║ GUID ║ COUNT1 ║ ║ ID ║ ITEM_GUID ║ CONTEXT ║ 
╠═════╬══════╬════════╣ ╠═════╬═══════════╬══════════╣ 
║ 1 ║ aaa ║  ║ ║ 1 ║ abc ║ ITEM ║ 
║ 2 ║ bbb ║  ║ ║ 2 ║ aaa ║ PAGE ║ 
║ 3 ║ ccc ║  ║ ║ 3 ║ bbb ║ ITEM ║ 
║ 4 ║ abc ║  ║ ║ 4 ║ ccc ║ ITEM ║ 
╚═════╩══════╩════════╝ ║ 5 ║ abc ║ ITEM ║ 
          ║ 6 ║ aaa ║ ITEM ║ 
          ║ 7 ║ abc ║ ITEM ║ 
          ║ 8 ║ ccc ║ PAGE ║ 
          ╚═════╩═══════════╩══════════╝ 

我試圖做的是填寫COUNT1列項與數量的計數ITEM_GUID出現在所有ITEM.GUID的ITEM_TRU中,ENDDATE仍在將來。我需要爲ITEM中的所有GUIDS每小時做一次。

我可以計數我需要輕鬆

SELECT ITEM_GUID, COUNT(*) from ITEM_TRACK GROUP BY ITEM_GUID; 

什麼我不知道該怎麼做的是,我怎麼合併這與INSERT INTO語句來自動更新的項目表中的所有項目根據他們的ENDDATE計數?

UPDATE: 我有一個工作解決方案基於Aquillo的回答是:

UPDATE ITEM a 
SET COUNT1 = (SELECT COUNT(*) AS total FROM ITEM_TRACK b WHERE b.item_guid=a.guid); 

是否有任何其他方式做到這一點沒有一個子查詢?

回答

1

您可以從選擇插入這樣的:

INSERT INTO myTable (foreignKey, countColumn) VALUES 
    SELECT ITEM_GUID, COUNT(*) from ITEM_TRACK GROUP BY ITEM_GUID; 

在要更新的情況下,嘗試這樣的事情:

UPDATE from SELECT using SQL Server

+0

好的。這不正是我想要的,但它確實幫助我得到一個工作解決方案....有沒有辦法做到這一點,而不做子查詢? – kasdega

0

如果使用INSERT INTO你會把ITEM表中的其他行不更新現有的行。如果這是你的意思,那麼這很好,但如果你想更新現有的,你需要使用更新。您可以通過將要更新的表與要更新的表聯接來完成此操作。但是,在你的情況下,你想要從聚合中更新,所以你需要創建一個包含聚合值的表。試試這個:

UPDATE ITEM SET Count1 = temp.total 
FROM Item 
INNER JOIN (
    SELECT ITEM_GUID, COUNT(*) AS total 
    FROM ITEM_TRACK 
    GROUP BY ID) AS temp 
ON Item.GUID = temp.ITEM_GUID 
WHERE ENDDATE > NOW() 

我已經試過此SQL Server上(使用GETDATE()而不是NOW())仔細檢查,它的工作,我認爲它應該在MySQL工作。

+0

這個語法不適用於Mysql,我不完全確定如何調整它。這可能有效,但比我聰明的人將不得不評估並提出不同的語法。 – kasdega