【问题标题】:MySQL: Count records from one table and then update anotherMySQL:计算一个表中的记录,然后更新另一个
【发布时间】:2009-08-01 08:33:34
【问题描述】:

有 2 个表/实体,非常简单的场景。

表格诗人 - 列:id、poet、nation

nations - 列:id、nation、count

基本上,nationspoets 具有一对多的映射,自然而然。例如,有来自 60 个国家的 1000 位诗人。 poets 中的每个诗人都由包含 nations 中的一个国家的 id 的国家字段分配给一个国家。

nations 的计数字段包含来自该国家的 poets 中诗人的数量。

我的问题是如何仅使用一个 SQL 查询来统计 poets 中按国家/地区划分的诗人数量,然后更新该国家/地区的相应计数?

我试过了:

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id

但它给出了 #1064 错误。还尝试在某处结合 WHERE 子句,但它仍然拒绝工作。

有什么想法吗?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    使用子查询:

    UPDATE nations 
       SET count = (
           SELECT COUNT(id) 
             FROM poets 
            WHERE poets.nation = nations.id 
            GROUP BY id
           );
    

    【讨论】:

    • 请注意,对于非常大的表(500000+ 条记录),这可能会变得非常慢。
    • 另外,如果 countries.count 不可为空,这可能会导致警告。使用 IFNULL 来防止这种情况。更新国家 SET count = IFNULL((SELECT COUNT(id) FROM potters WHERE poets.nation = countries.id GROUP BY id),0);
    • 我认为 COUNT() 不能返回 NULL。如果没有找到行,它就只是 0。
    • @dusoft 如果数据很大,有没有更好的方法来更新其他表的计数?
    • 在后台使用 cron 作业定期执行此操作,而不会影响您的网站速度。
    【解决方案2】:

    您只是不需要 GROUP BY,参见:

    UPDATE nations SET count = (
      SELECT COUNT(id) FROM poets 
        WHERE poets.nation = nations.id);
    

    或者更确切地说,使用 GROUP BY,子查询将为没有诗人的国家返回 NULL。如果没有 GROUP BY,在这种情况下子查询将返回 0。

    【讨论】:

    • null/0 有/无分组依据 - 这有帮助。谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多