Tizel Posté 14 Avril 2006 Partager Posté 14 Avril 2006 Bonjour, J'ai un petit probléme avec Dotclear. Je reçoit parfois des vagues de spams (par commentaires ou trackbacks). Comme j'ai un peu la flemme de les supprimer un par un à la main, j'ai recours à une requête SQL pour supprimer les spams. Par exemple, pour supprimer la vague de spams de ce matin, j'ai fait : DELETE FROM `dc_comment` where comment_content like '%lipitor%' Le probléme, c'est qu'une fois cette opération faite, le nombre de trackback dans la table des posts ('dc_post') n'est plus bon. Dans dotclear, la fonction qui optimise la base (voir dans outils/Opérations MySQL) recompte bien les commentaires, mais pas les trackbacks. Je cherche donc LA requête mysql qui va bien pour mettre à jour le nombre des trackbacks dans la table dc_post. J'ai essayé : UPDATE dc_post, dc_commentSET nb_trackback=count(dc_comment.nb_trackback)WHERE dc_comment.comment_pub=1 & dc_comment.comment_trackback=1 & dc_comment.post_id=dc_post.post_id mais j'ai l'erreur suivante : #1111 - Invalid use of group function Quelqu'un aurait une idée de comment faire ? Tizel Pour info : http://www.dotclear.net/forum/viewtopic.php?id=17335 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spidetra Posté 14 Avril 2006 Partager Posté 14 Avril 2006 (modifié) tu fait un count() sans faire de group by. Note : faire un count(*) plutot que count(nom_de_champ) Un truc du style, sans aucune garantie. : UPDATE dc_post, dc_commentSET nb_trackback=count(dc_comment.nb_trackback)WHERE dc_comment.comment_pub=1 & dc_comment.comment_trackback=1 & dc_comment.post_id=dc_post.post_idGROUP BY dc_comment.post_id Modifié 14 Avril 2006 par Spidetra Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spidetra Posté 14 Avril 2006 Partager Posté 14 Avril 2006 Ma réponse est fausse les GROUP BY ne sont pas autorisés dans les UPDATE. Elle me plaisait pas trop cette requête UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] Fait deux requêtes : - Un SELECT pour récupérer ton count(*) - Ton update derrierre Lien vers le commentaire Partager sur d’autres sites More sharing options...
captain_torche Posté 14 Avril 2006 Partager Posté 14 Avril 2006 Sinon, quelle est la différence, en termes de performance ou autre, entre un COUNT(champ) et un COUNT(*) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spidetra Posté 14 Avril 2006 Partager Posté 14 Avril 2006 (modifié) En terme de performance quasiment aucune. Les optimiseurs SQL font bien leur boulot aujourd'hui. Par contre il existe une différence de sens - count(*) : compte la cardinalité d'une table. Le nombre de ligne de la table ou de la requête. Sauf erreur de ma part, c'est ce que voulait faire Tizel. Donc je lui ai conseillé de mettre count(*) - count( [DISTINCT|ALL] expression ) : Compte le nombre d'expression connu. Donc, après avoir enlevé les valeurs NULL. - Sur une clé primaire : count(*) et count(primary_key) sont strictement équivalent. Par habitude, je m'impose comme règle d'utiliser count(*) si je veux compter les lignes et pas count(primary_key) Modifié 14 Avril 2006 par Spidetra Lien vers le commentaire Partager sur d’autres sites More sharing options...
Tizel Posté 14 Avril 2006 Auteur Partager Posté 14 Avril 2006 Merci Spidetra pour m'avoir mis sur la voie. Voici le résultat : UPDATE dc_postSET nb_trackback=0;CREATE TEMPORARY TABLE tmpSELECT post_id, count(*) as comptFROM dc_commentWHERE comment_pub=1 && comment_trackback=1GROUP BY post_id;UPDATE dc_post, tmpSET dc_post.nb_trackback=tmp.comptWHERE dc_post.post_id=tmp.post_id; Tizel Lien vers le commentaire Partager sur d’autres sites More sharing options...
captain_torche Posté 14 Avril 2006 Partager Posté 14 Avril 2006 Ok, merci Spidetra. Effectivement, comme je l'utilisais sous la forme COUNT(primary_key), je ne voyais pas de différence. Mais effectivement, le fait de ne pas compter les valeurs NULL, peut être bien pratique. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant