通过从另一个表插入外键计数来更新表

时间:2014-02-10 21:14:30

标签: mysql sql insert-update

我有两张桌子:

    ╔════════════════╗    ╔════════════════╗
    ║ 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   ║
                          ╚═════╩═══════════╩══════════╝

我要做的是在ITEM中填写COUNT1列,其中包含ITEM_GUID在ITEM_TRACK中显示的所有ITEM.GUID的次数,其中ENDDATE仍在将来。我需要每小时对ITEM中的所有GUID执行此操作。

我可以轻松获得我需要的计数

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

我不知道该怎么办,如何将其与INSERT INTO语句合并,以自动更新items表中的所有项目,并根据ENDDATE计数?

更新 我有一个基于Aquillo答案的工作解决方案:

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

如果没有子查询,还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

您可以从以下选项中插入:

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

如果您想要更新,请尝试以下方式:

UPDATE from SELECT using SQL Server

答案 1 :(得分: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。