2009-08-01 4 views
23

Vous avez 2 tables/entités, scénario très simple.MySQL: Compter les enregistrements d'une table et en mettre à jour une autre

Tableau poètes - Colonnes: id, poète, nation

Tableau nations - Colonnes: id, nation, comte

Fondamentalement, nations à poètes a une cartographie d'un à beaucoup, naturellement. Par exemple, il y a 1000 poètes de 60 nations. Chaque poète en poètes est assigné à une nation par le champ de la nation qui contient l'identifiant de l'une des nations en nations.

Le champ de comptage des nations contient le nombre de poètes dans poètes de cette nation.

Ma question est comment utiliser une seule requête SQL pour compter le nombre de poètes par nation dans poets et ensuite mettre à jour le nombre correspondant de cette nation?

J'ai essayé:

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

Mais il donne l'erreur # 1064. Aussi essayé de combiner la clause WHERE quelque part, mais il refuse toujours de travailler.

Une idée?

Répondre

32

Utilisez un sous-requête:

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

Merci, ça marche! –

+6

s'il vous plaît noter que pour les très grandes tables (500000+ enregistrements) cela pourrait devenir très lent. – dusoft

+0

En outre, si nations.count n'est pas Nullable, cela peut entraîner des avertissements. Utilisez un IFNULL pour vous protéger contre cela. UPDATE nations SET count = IFNULL ((SELECT COUNT (id) FROM poètes OERE poets.nation = nations.id GROUP BY id), 0); –

18

Tu ne avez pas besoin GROUP BY, cf .:

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

Ou plutôt, avec GROUP BY, la sous-requête retournera NULL pour les nations qui n'ont pas poètes. Sans GROUP BY, la sous-requête renverra 0 dans ce cas.

+0

null/0 différence avec/sans groupe par - cela a aidé. Merci –

Questions connexes