#5033 - Note : mémo SQL
Quelques heures que je me casse la tête pour faire une requête unique.
Dans blogotext il y a 2 tables : articles et commentaires.
"articles" contient un champ avec le nombre de commentaires associés à chaque article (non ce n’est pas dynamique).
"commentaires" dispose d’un champ "id_article" pour lier chaque commentaire à un article.
Pour compter le nombre de commentaires lié à un commentaire, on utilise count().
Mon problème était de faire une requête unique qui :
– comptait le nombre de commentaires pour chaque articles (dans la table commentaires)
– plaçait le résultat dans le champ du nombre de commentaires (dans la table articles).
(donc un update avec un select et un join et un count)
Voilà le truc :
$query = "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)";
Étrangement j’ai lu un peu partout que c’était « impossible ». Mon code marche sous SQLite, mais j’ai pas testé MySQL.
EDIT : marche pô avec MySQL. Dommage.
EDIT-EDIT : pour MySQL :
$query = "UPDATE articles SET nb_comments = (SELECT count(articles.id) FROM commentaires WHERE commentaires.article_id = articles.id)";
Dans blogotext il y a 2 tables : articles et commentaires.
"articles" contient un champ avec le nombre de commentaires associés à chaque article (non ce n’est pas dynamique).
"commentaires" dispose d’un champ "id_article" pour lier chaque commentaire à un article.
Pour compter le nombre de commentaires lié à un commentaire, on utilise count().
Mon problème était de faire une requête unique qui :
– comptait le nombre de commentaires pour chaque articles (dans la table commentaires)
– plaçait le résultat dans le champ du nombre de commentaires (dans la table articles).
(donc un update avec un select et un join et un count)
Voilà le truc :
$query = "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)";
Étrangement j’ai lu un peu partout que c’était « impossible ». Mon code marche sous SQLite, mais j’ai pas testé MySQL.
EDIT : marche pô avec MySQL. Dommage.
EDIT-EDIT : pour MySQL :
$query = "UPDATE articles SET nb_comments = (SELECT count(articles.id) FROM commentaires WHERE commentaires.article_id = articles.id)";