Version complète: sur le forum Webmaster Hub : Recomptage des Trackbacks dans Dotclear
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
Tizel
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 :

CODE
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é :

CODE
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 :

CITATION
#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
Spidetra
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. :
SQL
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
Spidetra
Ma réponse est fausse les GROUP BY ne sont pas autorisés dans les UPDATE. Elle me plaisait pas trop cette requête
SQL
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
captain_torche
Sinon, quelle est la différence, en termes de performance ou autre, entre un COUNT(champ) et un COUNT(*) ?
Spidetra
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)
Tizel
Merci Spidetra pour m'avoir mis sur la voie. Voici le résultat :

CODE
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
captain_torche
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.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.