【问题标题】:Updating a MySQL table with the COUNT of another用另一个的 COUNT 更新 MySQL 表
【发布时间】:2010-12-01 20:57:40
【问题描述】:

我正在尝试使用另一个表 Videos 中的 COUNT 更新表 Profiles 中的列。所有视频都存储在Videos 表中,我想在Profiles 中创建一个名为VideoCount 的列,它显示Videos 表中该用户视频的COUNT。

基本上,我想运行一个 cron 作业 - 所以我需要知道如何在 Videos 表中找到用户视频的 COUNT,然后使用此计数在 Profiles 中更新该用户的 VideoCount

要识别谁上传了哪个视频,Videos.OwnerProfiles.ID 应该匹配。有人知道我需要为 PHP 文件 cron 作业运行的 SQL 吗?

【问题讨论】:

  • 这就是您使用触发器所做的事情:当您在 Videos 表中插入一行时,您会增加 Profiles 表中的列。
  • @Vincent Savard 如果经常上传,可以使用 cron(不需要 100% 正确的 Count-Columns (imo)),并且由于他想添加此列,因此他需要此 sql - 无论如何声明
  • @maggie :这是他的电话。但是有了触发器,他就不需要这条sql语句了,他只会做一个UPDATE table SET col = col + 1 -- etc
  • @Vincent Savard 每秒 1000 次更新和 5 分钟内 1 次之间的差异。
  • @maggie :准确或错误之间存在差异。另外,您很可能不知道 Jamie 必须执行多少查询。通过您的查询,您可能会无缘无故更新 95% 的表。正如我所说,这是他的电话,他比我们更了解这个问题。

标签: php mysql cron


【解决方案1】:
UPDATE Profiles
SET VideoCount = (
   SELECT COUNT(*)
   FROM Videos
   WHERE Videos.Owner = Profiles.ID);

尽可能简单^^

如果你喜欢它:你可能需要的所有触发器:

DELIMITER //

CREATE TRIGGER increaseVideoCount AFTER INSERT ON Videos
  FOR EACH ROW BEGIN
    UPDATE Profiles SET VideoCount = VideoCount + 1 WHERE ID = NEW.Owner;
  END;
//

CREATE TRIGGER decreaseVideoCount AFTER DELETE ON Videos
  FOR EACH ROW BEGIN
    UPDATE Profiles SET VideoCount = VideoCount - 1 WHERE ID = OLD.Owner;
  END;
//

CREATE TRIGGER checkVideoCount AFTER UPDATE ON Videos
  FOR EACH ROW BEGIN
    IF OLD.Owner <> NEW.Owner THEN
      UPDATE Profiles SET VideoCount = VideoCount + 1 WHERE ID = NEW.Owner;
      UPDATE Profiles SET VideoCount = VideoCount - 1 WHERE ID = OLD.Owner;
    END IF;
  END;
//

DELIMITER ;

【讨论】:

  • +1 并链接到@Rahul Mehta 的答案,这将是完整的。
  • 谢谢。我的托管公司(出于某种奇怪的原因)不允许使用 MySQL 触发器 - 所以我要么必须使用 cron 作业,要么更新 PHP 以便在上传文件时更新(这是我选择的选项)。
【解决方案2】:

如果您想更新视频计数,您可以在上传时更新视频计数,所以我认为不需要 cron 作业。

update profiles set videocount=(select count(*) from videos where profileid =$profileid ) 
where profileid=$profileid

【讨论】:

    【解决方案3】:

    有点像

    UPDATE A SET VideoCount = 
    (
      SELECT COUNT(B.*) 
      FROM Videos AS B INNER JOIN Profiles AS B ON (A.Profile_ID = B.Owner_ID)  
      GROUP BY B.Owner_ID
    );
    

    我不确定这个语法是否完全正确。试试看

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多