Jump to content
Sign in to follow this  
Tizel

Recomptage des Trackbacks dans Dotclear

Rate this topic

Recommended Posts

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

Share this post


Link to post
Share on other 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

Edited by Spidetra

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Sinon, quelle est la différence, en termes de performance ou autre, entre un COUNT(champ) et un COUNT(*) ?

Share this post


Link to post
Share on other 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)

Edited by Spidetra

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...