2009-08-01 3 views
23

두 테이블/엔티티가 매우 간단합니다.MySQL : 한 테이블의 레코드를 계산 한 다음 다른 테이블을 업데이트하십시오.

시인 - 열 : ID, 시인, 국가

국가 - 열 : ID가, 국가가, 계산

기본적으로, 하나의 매핑을 가지고국가시인 자연스럽게 많은 사람들에게. 예를 들어, 60 개국 출신의 1000 명의 시인이 있습니다. 시인의 각 시인은 국가 중 하나의 ID가 개의 국가 인을 포함하는 국가 필드에 의해 국가에 할당됩니다.

카운트 필드 에는이 국가의 시인 수 명의 시인이 포함되어 있습니다.

내 질문은 시인에있는 국가 별 시인 수를 세는 데 하나의 SQL 쿼리를 사용한 다음 해당 국가의 해당 개수를 업데이트하는 방법입니다.

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id 

을하지만 #에게 1064 오류를 제공합니다

나는 시도했다. 또한 WHERE 절을 어딘가에 결합하려고했지만 여전히 작동을 거부합니다.

아이디어가 있으십니까?

답변

32

하위 쿼리를 사용

UPDATE nations 
    SET count = (
     SELECT COUNT(id) 
     FROM poets 
     WHERE poets.nation = nations.id 
     GROUP BY id 
     ); 
+0

고마워요, 그 트릭을 작동! –

+6

매우 큰 테이블 (500000 + 레코드)의 경우 매우 느려질 수 있습니다. – dusoft

+0

또한 nations.count가 Null을 허용하지 않으면 경고가 발생할 수 있습니다. 이것을 막기 위해 IFNULL을 사용하십시오. UPDATE nations SET count = IFNULL ((count count (id) FROM 시인 WHERE poets.nation = nations.id GROUP BY id), 0); –

18

당신은 단지 GROUP BY, CF :

UPDATE nations SET count = (
    SELECT COUNT(id) FROM poets 
    WHERE poets.nation = nations.id); 

또는 오히려, GROUP BY와 필요하지 않습니다,하지 않은 국가에 대해 NULL을 반환합니다 부질 시인. GROUP BY를 사용하지 않으면 하위 쿼리가이 경우 0을 반환합니다.

+0

null/0 (그룹 별/그룹 별) 차이 - 도움이되었습니다. 고마워 –

관련 문제