2009-08-01 10 views
23

2つのテーブル/エンティティがあり、非常に単純なシナリオです。MySQL:1つのテーブルからレコードを数え、次に別のテーブルを更新します。

詩人 - 列:ID、詩人、国家

- 列:idは、国が、カウント

基本的には、1のマッピングを持っている詩人自然に多くの人に。たとえば、60カ国から1,000人の詩人がいます。 詩人の各詩人は、国のいずれかの国のidを含む国のフィールドに国番号の国家に割り当てられています。

国のカウント・フィールドはこの国から詩人で詩人の数が含まれています。

私の質問は、の詩人の国家による詩人数を数え上げるためにどのように1つの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((票数を選択してください)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

グループの有無にかかわらずヌル/ 0差異 - これが助けになりました。ありがとう –

関連する問題