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.
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.
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
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)
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;