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

Mysql 通过从另一个表插入外键计数来更新表,mysql,sql,insert-update,Mysql,Sql,Insert Update,我有两张桌子: ╔════════════════╗ ╔════════════════╗ ║ ITEM ║ ║ ITEM_TRACK ║ ╠════════════════╣ ╠════════════════╣ ║ ID ║ ║ ID ║ ║ GUID ║ ║ ITEM_GUID ║ ║ COUNT1

我有两张桌子:

    ╔════════════════╗    ╔════════════════╗
    ║ 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中出现的次数,其中ENDDATE仍然在将来。我需要每小时为项目中的所有GUID执行一次

我可以很容易地得到我需要的计数

SELECT ITEM_GUID, COUNT(*) from ITEM_TRACK GROUP BY ITEM_GUID;
我不知道如何做的是,如何将其与INSERT INTO语句合并,以根据项目的结束日期使用计数自动更新项目表中的所有项目

更新: 根据阿奎罗的回答,我有一个有效的解决方案:

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

没有子查询,还有其他方法可以执行此操作吗?

您可以从如下选择中插入:

INSERT INTO myTable (foreignKey, countColumn) VALUES 
    SELECT ITEM_GUID, COUNT(*) from ITEM_TRACK GROUP BY ITEM_GUID;
如果要更新,请尝试以下操作:

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

如果使用INSERT INTO,则会在项目表中添加其他行,而不会更新现有行。如果这就是你的意思,那就太好了,但是如果你想更新现有的,你需要使用update。通过将要更新的表与要从中更新的表连接起来,可以实现此目的。然而,在您的情况下,您希望从聚合进行更新,所以您需要创建一个具有聚合值的表。试试这个:

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上工作。

这个语法在MYSQL上不起作用,我不完全确定如何调整它。这可能有效,但比我聪明的人必须评估并提供不同的语法。好的。这并不完全是我想要的,但它确实帮助我获得了一个有效的解决方案……有没有一种不用子查询就能做到这一点的方法?