【问题标题】:How to update one table based on the count value of another table while matching ids?如何在匹配 id 时根据另一张表的计数值更新一张表?
【发布时间】:2013-08-12 22:57:27
【问题描述】:

有两个表:articlescmets。它们之间存在关联:每个 comment 都持有它所属的 article 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

articles 表还有一个列,其中保存了相关联的 cmets 的当前计数。 这是一个SQLFiddle,其中包含所描述表格的基本设置。

在导入了一堆 articlescmets 之后,如何将每篇 article 上的 cmets_count 更新为反映关联 cmets 的数量?

【问题讨论】:

  • +1 表示格式良好的问题,包括小提琴。

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


【解决方案1】:

试试这个查询:

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

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

【讨论】:

  • 如果文章没有 cmets,左连接会更好。
  • 可能。我认为这取决于文章是否填充了计数,默认为 0 或 null 以及是否可以删除 cmets。
  • @DanielWilliams 到目前为止看起来不错。 comment_count 的默认值为 0。如果 cmets 被删除,我希望能够重新运行命令以更新 cmets_count
  • @DanielWilliams 我刚刚在 120,000 个项目的数据集上测试了更新后的语句。与没有COALESCE 的前JOIN 版本相比,LEFT JOIN 版本需要~ 4.4 倍。你能描述一下原因吗?
【解决方案2】:

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

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

一些比较效率的基准测试?仅作记录,我相信丹尼尔的回答更有效率。

【讨论】:

  • 感谢您的完整。 JOIN 应该扩展到级联。
  • 嘿,谢谢它的工作原理,有没有其他方法可以达到相同的结果
  • @pitu 当然,请参阅其他答案。我的是经典的(不加入),而丹尼尔的效率更高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2022-01-24
相关资源
最近更新 更多