SQL : update avec JOIN + Count()

Résolu/Fermé
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 - 1 mars 2013 à 21:10
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 - 2 mars 2013 à 01:54
Bonjour, j'ai une BDD SQL avec deux tables : articles et commentaires.
La table article contient un champ "id" unique et un champ "nb_comments" qui doit contenir le nombre de commentaires associés à lui.

La table commentaire contient un champ "article_id", où chaque commentaire est ainsi lié à une article.

Ce que je veux, en une seule requête :
- balayer tous les articles
- compte le nombre de commentaires pour chaque article
- remplir le champ "nb_com" avec le nombre de commentaires trouvés.


J'ai déjà ça :
SELECT a.id, a.nb_comments, count(a.id) AS nbr 
FROM articles a INNER JOIN commentaires c
ON (c.article_id = a.bt_id) GROUP BY a.bt_id


Qui me compte pour chaque article "id" le nombre de commentaires associés. Mais comment enregistrer le nombre de commentaires dans chaque champ 'nb_comments" d'un article ?

J'ai tenté ça :

UPDATE articles SET nb_comments = (SELECT count(a.id) FROM articles a INNER JOIN commentaires c ON (c.article_id = a.id) GROUP BY a.id ) 


Mais ça ne marche pas : tous les articles se voient associer au nombre de commentaires du premier article de la base, ce qui ne va pas.

Si je met un WHERE id = 42 à la fin :
UPDATE articles SET bt_nb_comments = (SELECT count(a.bt_id) FROM articles a INNER JOIN commentaires c ON (c.bt_article_id = a.bt_id) GROUP BY a.bt_id ) WHERE id = 42


alors seule l'article 42 se vera atribuer le nombre de commentaires du premier article.

Si je met un WHERE a.id=42 dans le SELECT :
UPDATE articles SET bt_nb_comments = (SELECT count(a.bt_id) FROM articles a INNER JOIN commentaires c ON (c.bt_article_id = a.bt_id) WHERE a.id=42 GROUP BY a.bt_id )


alors tous les articles se voient attribuer le nombre de commentaires de l'article 42.

Une solution pour que chaque article ait son nombre de commentaires associés ?
Je bosse en PHP.



A voir également:

1 réponse

le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
2 mars 2013 à 01:00
Finalement j'ai trouvé un code qui marche :

UPDATE articles SET nb_comments = (SELECT count(a.id) FROM articles a INNER JOIN commentaires c ON (c.article_id = a.id) WHERE articles.id = a.id GROUP BY a.id)


Notez que le join se fait après le ON sur :
c.article_id = a.id

Et que le where se fait sur ça :
articles.id = a.id

article.id et a.id ne sont pas identiques : le premier est créé par le UPDATE et le second par le SELECT.
Là était la subtilité.

Ce code fonctionne avec SQLite.
1
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
2 mars 2013 à 01:54
Et pour MySQL :

UPDATE articles SET nb_comments = (SELECT count(articles.id) FROM commentaires WHERE commentaires.article_id = articles.id)
0