Mysql 如何在匹配ID时根据另一个表的计数值更新一个表?
有两个表格:文章和评论。它们之间有一种关联:每个评论都持有它所属的文章idMysql 如何在匹配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 |
-----------------------------
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
);