source

다른 필드의 COUNT가 SQL인 열을 업데이트하시겠습니까?

factcode 2023. 11. 5. 15:00
반응형

다른 필드의 COUNT가 SQL인 열을 업데이트하시겠습니까?

다음 테이블을 준비했습니다.

Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

다음과 같이 기사 테이블의 NUM_Comments 필드를 기사에 대한 코멘트의 개수로 업데이트하는 sql 문이 필요합니다.

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

위 sql이 작동하지 않아 Invalid Use for Group 함수 오류가 발생합니다.여기 MySQL을 사용하고 있습니다.

업데이트 문에 가입할 수 없습니다.그럴 것 같네요.

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

이렇게 하면 전체 기사 표가 업데이트되며, 원하는 것이 아닐 수도 있습니다.하나의 기사만 업데이트하려는 경우 하위 쿼리 뒤에 'where' 절을 추가합니다.

이 정도면 될 겁니다.

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

카운트(*)에 문제가 있을 수 있습니다. 특히 카운트와 (*) 사이의 공백...

sqlite, pgsql에서 sql을 작업하는 것은 다음과 같습니다.

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 - article table에서 ids를 모두 선택합니다.

2 - 반복하여 다음 명령을 실행합니다.

기사 업데이트 NUM_COMMENTs set NUM_COMMENTs = (댓글에서 count(id) 선택, id = $id), id = $id

그것을 더 향상시키기 위해, 첫번째 선택에서 모든 값을 선택하지 마세요, 특히 그 표가 너무 클 때, 당신은 기사들을 반복하고 반복 당 1000개의 레코드를 얻어야 합니다.이렇게 하면 DB 풀에서 정상적인 DB 쓰레드를 유지하고 대역폭도 절약할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6135226/update-a-column-with-a-count-of-other-fields-is-sql

반응형