关于mysql:用COUNT替换其他字段的列是SQL吗?

Update a column with a COUNT of other fields is SQL?

嗨,伙计们,我准备好了下表:

1
2
3
4
5
Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

我需要一个SQL语句,它用针对文章的注释数更新文章表的num_comments字段,如:

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

上面的SQL不起作用,我得到一个无效的use fo group函数错误。我在这里使用MySQL。


在UPDATE语句中不能有联接。应该是

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

这将更新整个项目表,这可能不是您想要的。如果您只想更新一篇文章,那么在子查询后添加一个"where"子句。


这应该有效。

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

但我希望在发布评论时只更新一条记录:

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


count(*)可能有一些问题,特别是在count和(*)之间有空格…

因此,在sqlite上使用SQL,pgsql将是:

1
2
3
4
update articles
  set num_comments =
    (select count(id) from comments
     where comments.article_id = articles.id)

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

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;


不能用一般的内部联接方式进行此操作。但你可以通过另一种方式做到:

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

2-迭代并执行以下命令

更新文章set num_comments=(select count(id)from comments where id=$id)where id=$id

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