32

次のテーブルを設定しています。

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は機能せず、グループ関数の無効な使用エラーが発生します。ここではMySQLを使用しています。

4

5 に答える 5

47

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

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

これにより、記事テーブル全体が更新されますが、これは希望どおりではない可能性があります。1つの記事のみを更新する場合は、サブクエリの後に「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)

しかし、コメントが投稿されたときに、1つのレコードだけを更新したいと思います。

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

列数のみに基づいて更新するには、次のようにします。

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 に答える
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 に答える
-2

一般的な内部結合方法でそれを行うことはできません。しかし、あなたは別の方法でそれを行うことができます:

1-記事テーブルからすべてのIDを選択します

2-それらを繰り返し、次のコマンドを実行します

記事の更新セットNUM_COMMENTS=(id = $ idのコメントからcount(id)を選択)ここでid = $ id

さらに強化するには、最初の選択ですべての値を選択しないでください。特にそのテーブルが大きすぎる場合は、記事を反復処理し、反復ごとに1000レコードを取得する必要があります。このようにして、uはDBプールから正常なDBスレッドを維持し、帯域幅も節約します。

于 2011-05-26T07:51:27.143 に答える