Aller au contenu

Recomptage des Trackbacks dans Dotclear


Tizel

Sujets conseillés

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_comment
SET 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

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_comment
SET 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
GROUP BY dc_comment.post_id

Modifié par Spidetra
Lien vers le commentaire
Partager sur d’autres sites

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

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é par Spidetra
Lien vers le commentaire
Partager sur d’autres sites

Merci Spidetra pour m'avoir mis sur la voie. Voici le résultat :

UPDATE dc_post
SET nb_trackback=0;

CREATE TEMPORARY TABLE tmp
SELECT post_id, count(*) as compt
FROM dc_comment
WHERE comment_pub=1 && comment_trackback=1
GROUP BY post_id;

UPDATE dc_post, tmp
SET dc_post.nb_trackback=tmp.compt
WHERE dc_post.post_id=tmp.post_id;

Tizel

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...