web-dev-qa-db-ja.com

SQLが他のフィールドのCOUNTで列を更新しますか?

こんにちは皆さん、私は以下のテーブルをセットアップしています:

Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

次のような記事に対して行われたコメントのカウントで、articlesテーブルのNUM_Commentsフィールドを更新するSQLステートメントが必要です。

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

上記のsqlは機能せず、Invalid Use fo Group関数エラーが表示されます。ここではMySQLを使用しています。

20
Ali

更新ステートメントに結合することはできません。そのはず

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

これにより、articlesテーブル全体が更新されますが、これは必要なものではない場合があります。 1つの記事のみを更新する場合は、サブクエリの後に「where」句を追加します。

34
No'am Newman

これは動作するはずです。

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

しかし、コメントが投稿された場​​合は、1つのレコードのみを更新します。

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

count(*)は、特にcountと(*)...

sqliteでsqlを使用する場合、pgsqlは次のようになります。

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

列数だけに基づいて更新するには、次のようなことができます。

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;
0
ctoepfer