Je crée actuellement un système de post relativement basique avec la possibilité pour les membres du site d'écrire des commentaires (une table posts, une table comments - voir ci dessous) et je souhaite récuperer le nombre de commentaire de chaque post pour pouvoir l'afficher a coté du titre de chaque post (dans une page qui afficherait simplement le titre de tous les post existants, chacun d'eux etant un lien vers le post en question).
J'aurais pu avoir une requete qui joigne les deux tables et compte pour chaque post le nombre de commentaires correspondant. Cependant, il me semble que cela ferait beaucoup trop de requetes (un COUNT par post, n'est pas envisageable pour afficher une grande quantité de posts).
Afin obtenir un affichage plus rapide, je pense donc créer un champ nbr_comments dans la table posts qui contiendrait le nombre de commentaires du post (o rly?) et me permettrait de selectionner directement le résultat, et ce sans meme faire de jointure.
Ma question est donc de savoir quelle méthode est la meilleure pour renseigner ce champ.
Est-il possible de relier les deux tables pour qu'elles soient interdependantes, a savoir que le nombre de commentaires de chaque post soit automatiquement compte par MySQL et mis a jour dans le champ nbr_comments dans la ligne du post correspondant?
Sinon je pensais tout simplement appliquer le systeme suivant: a chaque fois que quelqu'un commente un post (donc sur la page complete du post avec le contenu etc..), je recupere la valeur de nbr_comments et je la renvoie, augmentée de 1.
Mais cette methode n'est-elle pas risquée si deux requetes sont effectuées en meme temps? Est-ce meme possible? Si oui, cela pourrait fausser totalement le nombre.
Enfin, la troisieme possibilité (assez similaire a la deuxieme) est de compter le nombre de commentaires correspondant au post lorsqu'un utilisateur poste un commentaire et de le renvoyer, augmenté de 1.
Mais, encore une fois, on se heurte au probleme des requetes simultanées.
Tu crées le trigger et il s'exécutera quand il faut, selon la manière dont tu l'auras créé.
Moui d'accord, ça dépend si tu es chatouilleux sur les performances ou pas du coup. Clairement, les triggers sont typiquement utilisés pour éviter ce genre de rquêtes en fait. Donc ça vaut la peine d'en passer par là c'est sûr.
Oui, c'est un peu performance vs poids de la BDD du coup.
Je vais me pencher la dessus alors. Merci pour l'info en tout cas, j'en avais jamais entendu parler avant!
J'ai essayé d'exécuter le trigger ci dessous mais MySQL me renvoie une erreur.
Le trigger:
delimiter |
CREATE TRIGGER after_insert_comments
AFTER INSERT ON comments FOR EACH ROW
BEGIN
UPDATE posts_text
SET nbr_comments = (OLD.nbr_comments + 1)
WHERE posts_text.id_post = comments.id_post;
END; |
delimiter ;
L'erreur renvoyée:
Citation : MySQL
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter |
CREATE TRIGGER after_insert_comments
AFTER INSERT ON commen' at line 1
OLD et NEW font référence à la table sur laquelle tu as mis le trigger (donc ici "comments").
Dans un trigger INSERT il n'y a pas de OLD.
Pour ta requête, fais simplement "UPDATE posts_text SET nbr_comments = nbr_comments + 1 WHERE id_post = constante" et tu remplaces la constante par NEW.id_post qui vient de la ligne insérée dans comments.
Donc :
delimiter |
CREATE TRIGGER after_insert_comments
AFTER INSERT ON comments FOR EACH ROW
BEGIN
UPDATE posts_text
SET nbr_comments = nbr_comments + 1
WHERE id_post = NEW.id_post;
END; |
delimiter ;
Pour ce qui est de l'erreur sur "delimiter |", aucune idée,
Simultaneité des requetes MySQL
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Tutoriel complet MySQL !
Tutoriel complet MySQL !