SQL : update avec JOIN + Count()
Résolu
le hollandais volant
Messages postés
5294
Statut
Membre
-
le hollandais volant Messages postés 5294 Statut Membre -
le hollandais volant Messages postés 5294 Statut Membre -
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 :
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 :
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 :
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 :
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.
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:
- SQL : update avec JOIN + Count()
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
- Sql query download - Télécharger - Gestion de données
- Ora-00933: la commande sql ne se termine pas correctement ✓ - Forum Oracle
1 réponse
Finalement j'ai trouvé un code qui marche :
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.
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.
UPDATE articles SET nb_comments = (SELECT count(articles.id) FROM commentaires WHERE commentaires.article_id = articles.id)