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

时间:2013-08-12 22:57:27

标签: mysql sql count group-by sql-update

有两个表:文章评论。它们之间存在关联:每个注释包含它所属的文章ID

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

...

-------------------------------
 comments
----+-------------+------------
 id |        text | article_id
----+-------------+------------
 1  | aaa comment |          1
 2  | aaa comment |          1
 3  | fff comment |          6
 4  | bbb comment |          2
 5  | ddd comment |          4
 6  | bbb comment |          2

文章表还有一个列,用于保存关联的评论的当前计数。 这是一个SQLFiddle,其中包含所描述表格的基本设置。

导入了大量文章评论之后,如何更新每个文章上的 comments_count 反映相关评论的数量

2 个答案:

答案 0 :(得分:4)

尝试此查询:

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上使用它(必须把它放在架构部分),然后选择所有文章显示正确的计数。

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

答案 1 :(得分:2)

作为替代方案,最常见的经典版本:

UPDATE articles a
SET comments_count= (
    SELECT count(*)
    FROM comments c
    WHERE a.id=c.article_id
);

一些基准比较效率?只是为了记录,我确信丹尼尔的答案更有效率。