我有两张桌子:
╔════════════════╗ ╔════════════════╗
║ 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);
如果没有子查询,还有其他方法吗?
答案 0 :(得分:1)
您可以从以下选项中插入:
INSERT INTO myTable (foreignKey, countColumn) VALUES
SELECT ITEM_GUID, COUNT(*) from ITEM_TRACK GROUP BY ITEM_GUID;
如果您想要更新,请尝试以下方式:
答案 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。