Mysql 如何在匹配ID时根据另一个表的计数值更新一个表?

Mysql 如何在匹配ID时根据另一个表的计数值更新一个表?,mysql,sql,count,group-by,sql-update,Mysql,Sql,Count,Group By,Sql Update,有两个表格:文章和评论。它们之间有一种关联:每个评论都持有它所属的文章id ----------------------------- articles ----+-------+---------------- id | title | comments_count ----+-------+---------------- 1 | aaa | 0 2 | bbb | 0 3 | ccc |

有两个表格:文章和评论。它们之间有一种关联:每个评论都持有它所属的文章id

-----------------------------
 articles
----+-------+----------------
 id | title | comments_count
----+-------+----------------
 1  |  aaa  |              0
 2  |  bbb  |              0
 3  |  ccc  |              0
 4  |  ddd  |              0
 5  |  eee  |              0
 6  |  fff  |              0

articles表还有一个列,用于保存当前关联注释的计数。 下面是一个示例,其中包含所述表格的基本设置

导入大量文章和评论后,如何更新每篇文章的评论数以反映相关评论的数量?

尝试以下查询:

UPDATE articles a
LEFT JOIN (
 SELECT
  article_id,
  count(*) as count
 FROM comments
 GROUP BY article_id
) AS b
ON a.id = b.article_id
SET comments_count = COALESCE(b.count, 0);
我在你的sqlfiddle上使用了它(必须把它放在schema部分),然后选择了所有的文章,为我显示了正确的计数


更新后,它将始终设置正确的值(您可以多次运行并在删除后运行等)

作为替代,最经典的版本:


比较效率的一些基准?为了记录在案,我相信Daniel的答案更有效。

如果文章没有评论,左连接会更好。可能吧。我认为这取决于文章是否填充了计数,默认值是0还是null,以及评论是否可以删除。@DanielWilliams到目前为止看起来不错<代码>注释计数的默认值为
0
。如果删除了注释,我希望能够重新运行命令来更新注释计数。@DanielWilliams我刚刚在120000个项目的数据集上测试了更新后的语句。与以前的
JOIN
版本相比,没有
COALESCE
左JOIN
版本所需的时间要长约4.4倍。你能描述一下原因吗?+1是一个结构合理的问题,包括一把小提琴。谢谢你的完整性。
JOIN
应该扩展到cascade.heya thanx它可以工作,还有其他方法可以实现同样的效果吗result@pitu当然,请看另一个答案。我的是经典的(无连接),而丹尼尔的更有效。
UPDATE articles a
LEFT JOIN (
 SELECT
  article_id,
  count(*) as count
 FROM comments
 GROUP BY article_id
) AS b
ON a.id = b.article_id
SET comments_count = COALESCE(b.count, 0);
UPDATE articles a
SET comments_count= (
    SELECT count(*)
    FROM comments c
    WHERE a.id=c.article_id
);