web-dev-qa-db-fra.com

Mettre à jour une colonne avec un nombre d'autres champs est SQL?

Salut les gars, j'ai les tables suivantes mis en place:

Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

J'ai besoin d'une instruction SQL qui met à jour le champ NUM_Comments de la table articles avec le compte des commentaires faits contre l'article comme:

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

Le sql ci-dessus ne fonctionne pas et j'obtiens une erreur d'utilisation non valide pour le groupe. J'utilise MySQL ici.

17
Ali

Vous ne pouvez pas avoir une jointure dans une instruction de mise à jour. CA devrait etre

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

Cela mettra à jour le tableau complet des articles, ce qui peut ne pas être ce que vous voulez. Si vous souhaitez mettre à jour un seul article, ajoutez une clause 'where' après la sous-requête.

31
No'am Newman

Cela devrait marcher.

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id)

Mais je préfère mettre à jour un seul enregistrement lorsque le commentaire a été posté:

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100
8
Deniss Kozlovs

count (*) peut avoir des problèmes, notamment avec un espace vide entre count et (*) ...

pour travailler sur sqlite, pgsql serait:

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

Pour mettre à jour uniquement en fonction du nombre de colonnes, vous pouvez effectuer les opérations suivantes:

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

ou ... si vous aviez une situation qui nécessitait un décompte continu:

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;

0
ctoepfer