32

我设置了以下表格:

Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

我需要一个 sql 语句来更新文章表的 NUM_Comments 字段,其中包含对文章的评论计数,例如:

update articles a, comments f 
set a.num_comments =  COUNT(f.`id`)
where f.article_id = a.id

上面的 sql 不起作用,我收到 Invalid Use fo Group 函数错误。我在这里使用 MySQL。

4

5 回答 5

47

您不能在更新语句中加入。它应该是

update articles
set num_comments =
(select count (*) from comments
where comments.article_id = articles.id)

这将更新整个文章表,这可能不是您想要的。如果您打算只更新一篇文章,请在子查询后添加“where”子句。

于 2011-05-26T07:43:51.180 回答
10

这应该有效。

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id)

但我宁愿在发表评论时只更新一条记录:

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100
于 2011-05-26T07:43:55.397 回答
0

count (*) 可能有一些问题,尤其是 count 和 (*) 之间的空格...

所以在 sqlite 上工作 sql,pgsql 将是:

update articles 
  set num_comments = 
    (select count(id) from comments 
     where comments.article_id = articles.id)
于 2018-11-15T23:35:33.883 回答
0

要仅根据列数进行更新,您可以执行以下操作:

update articles,
 (select count (*) 
  from comments
  where comments.article_id = articles.id) as newtotals
set articles.num_comments = newtotals.count;

或...如果您遇到需要滚动计数的情况:

update articles,
 (select (count (*)) + (articles.num_comments) as count 
  from comments
  join articles on 
    comments.article_id = articles.id
  group by articles.id) as newtotals
set articles.num_comments = newtotals.count;
于 2016-08-24T06:02:41.040 回答
-2

您不能以通用的内部连接方式进行操作。但是您可以通过以下方式以另一种方式做到这一点:

1- 从文章表中选择所有 id

2-迭代它们并执行以下命令

更新文章集 NUM_COMMENTS = (select count(id) from comments where id = $id) where id = $id

为了进一步增强它,在第一次选择中不要选择所有值,特别是当该表太大时,您需要迭代文章并每次迭代获得 1000 条记录。这样,您将从数据库池中维护一个健康的数据库线程,并且还可以节省带宽。

于 2011-05-26T07:51:27.143 回答