/trunk/services/modules/0.1/images/VotesImage.php |
---|
79,6 → 79,7 |
if ($resultat == false) { |
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); |
} else { |
self::updateStats($this->bdd, $ressources[0],$parametres['protocole']); |
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK); |
} |
} |
102,10 → 103,33 |
if ($resultat == false) { |
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); |
} else { |
self::updateStats($this->bdd, $ressources[0],$parametres['protocole']); |
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK); |
} |
} |
static function updateStats($db, $id_image, $id_proto) { |
$id_image = intval($id_image); |
$id_proto = intval($id_proto); |
if(!$id_image || !$id_proto) throw new Exception("Ne peut mettre à jour les statistiques de vote", |
RestServeur::HTTP_CODE_ERREUR); |
/* REPLACE ... SELECT: réinitalise les champs non-défini (MySQL 5.1) |
REPLACE ... SET a=b, c=d: idem ou plusieurs requête |
Du coup il faut récupérer les données actuelles mais REPLACE ne le permet pas |
(http://dev.mysql.com/doc/refman/5.5/en/replace.html : |
You cannot refer to values from the current row and use them in the new row.) |
D'où INSERT ... ON DUPLICATE KEY UPDATE. Notons que VALUES() récupère la valeur |
*associée* au champ passé en paramètre, c'est à dire VALUES(moyenne) == divo.moyenne */ |
$db->requeter(sprintf('INSERT INTO del_image_stat (ce_image, ce_protocole, moyenne, nb_votes)'. |
' SELECT ce_image, ce_protocole, AVG(valeur) AS moyenne, COUNT(valeur) AS nb_votes'. |
' FROM del_image_vote divo'. |
' WHERE ce_image = %d AND ce_protocole = %d GROUP BY ce_image, ce_protocole'. |
' ON DUPLICATE KEY UPDATE moyenne = VALUES(moyenne), nb_votes = VALUES(nb_votes)', |
$id_image, $id_proto)); |
} |
/*------------------------------------------------------------------------------- |
CONFIGURATION DU SERVICE |
--------------------------------------------------------------------------------*/ |
/trunk/scripts/modules/maj/201309-index-views.sql |
---|
47,21 → 47,23 |
DROP TABLE IF EXISTS `BASEDEL`.`del_image_stat`; |
CREATE TABLE IF NOT EXISTS `BASEDEL`.`del_image_stat` ( |
`ce_image` BIGINT(20) NOT NULL COMMENT 'id_image (tb_cel.cel_images)', |
`ce_protocole` INT(11) NULL DEFAULT NULL COMMENT 'un id de protocole', |
`moyenne` SMALLINT NOT NULL DEFAULT 0 COMMENT 'moyenne des votes pour une image et un protocole donné', |
`nb_tags` SMALLINT NOT NULL DEFAULT 0 COMMENT 'nombre de tags pictoflora associés à une image', |
`ce_protocole` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'un id de protocole', |
`moyenne` FLOAT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'moyenne des votes pour une image et un protocole donné', |
`nb_votes` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'nombre de votes pour une image et un protocole donné', |
`nb_tags` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'nombre de tags pictoflora pour une image donnée', |
PRIMARY KEY (`ce_image`, `ce_protocole`), |
KEY `ce_image` (`ce_image`), |
KEY `ce_protocole` (`ce_protocole`, `moyenne` DESC), |
KEY `nb_votes` (`nb_votes` DESC), |
KEY `nb_tags` (`nb_tags` DESC) |
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'table de stockage des statistiques utilisées pour les tri de PictoFlora'; |
INSERT INTO `BASEDEL`.`del_image_stat` (\ |
SELECT id_image, divo.ce_protocole, divo.moyenne, dit.ctags \ |
SELECT id_image, divo.ce_protocole, divo.moyenne, divo.nb_votes, dit.ctags \ |
FROM `BASECEL`.`cel_images` ci \ |
LEFT JOIN \ |
( SELECT ce_image, ce_protocole, AVG(valeur) AS moyenne FROM del_image_vote \ |
GROUP BY ce_image, ce_protocole ) AS divo |
( SELECT ce_image, ce_protocole, AVG(valeur) AS moyenne, COUNT(valeur) AS nb_votes |
FROM del_image_vote GROUP BY ce_image, ce_protocole ) AS divo |
ON ci.id_image = divo.ce_image \ |
LEFT JOIN \ |
( SELECT ce_image, COUNT(id_tag) as ctags FROM del_image_tag \ |