pppplus Posted April 20, 2010 Share Posted April 20, 2010 Bonjour,Depuis pas mal de temps, je dois m'occuper d'un "problème" sur la page meilleures ventes, alimentées par la table product_sale.En effet, les meilleures ventes ne semblent pas du tout coller à la réalité.Alors, j'ai fait un test, et j'ai vidé totalement la table, pour voir ce que ça fait sur 12 heures.Essai concluant :=> les ventes sont presque toutes comptées en doubleCa ne vient pas de modification de code, car je l'ai fait sur 3 boutiques différentes, et les chiffres sont similaires. En général, presque 2 fois plus de ventes dans product_sale que les ventes réelles.Avez-vous une idée précise de ce qui est comptabilisé dans cette table ?Les erreurs ne semblent pas provenir de panier non commandés.Pourquoi la requête meilleures ventes est-elle faite sur une table spécifique ? et pas à partir de la table orders ?C'est logiquement juste pour les performances, la table product_sale étant très petite, et logiquement bien alimentée.Je suis étonné que personne n'en parle sur le forum. Comme je l'ai écrit plus haut, ça ne semble pas venir de mes modifications, puisque je le constate sur d'autres boutiques dont une non modifiée (script d'origine).PS : 1.2.5 Link to comment Share on other sites More sharing options...
pppplus Posted April 20, 2010 Author Share Posted April 20, 2010 Je viens de créer une fonction pour remplacer celle utilisée :A mettre dans /Classes/ProductSale.php static public function getBestSales2($id_lang, $pageNumber = 0, $nbProducts = 10, $orderBy=NULL, $orderWay=NULL) { /* FONCTION FAITE PAR HUBERT - remplace la fonction getBestSales qui utilise la table product_sale, peu fiable) */ global $link, $cookie; //echo "orderway=".$orderWay; if ($pageNumber < 0) $pageNumber = 0; if ($nbProducts < 1) $nbProducts = 10; if (empty($orderBy) || $orderBy == 'position') $orderBy = 'sales'; if (empty($orderWay)) $orderWay = 'DESC'; $query = ' SELECT p.*, pl.`description`, pl.`link_rewrite`, pl.`name`, pl.`description_short`, i.`id_image`, il.`legend`, (SELECT SUM(od.product_quantity) FROM '._DB_PREFIX_.'order_detail od WHERE od.product_id = p.id_product) as sales FROM '._DB_PREFIX_.'product p LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.intval($id_lang).') LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).') LEFT JOIN '._DB_PREFIX_.'order_detail od ON od.product_id = p.id_product LEFT JOIN '._DB_PREFIX_.'orders o ON od.id_order = o.id_order WHERE p.active = 1 AND o.valid = 1 AND o.invoice_date > 0 GROUP BY od.product_id ORDER BY '.(isset($orderByPrefix) ? $orderByPrefix.'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' LIMIT '.intval($pageNumber * $nbProducts).', '.intval($nbProducts); //echo $query; $result = Db::getInstance()->ExecuteS($query); if($orderBy == 'price') { Tools::orderbyPrice($result,$orderWay); } if (!$result) return false; return Product::getProductsProperties($id_lang, $result); } Il faut aussi modifier le fichier /best-sales.php $smarty->assign(array( 'products' => ProductSale::getBestSales2(intval($cookie->id_lang), intval($p) - 1, intval($n), $orderBy, "DESC"), 'nbProducts' => $nbProducts)); J'ai juste remplacé => getBestSales par getBestSales2=> $orderWay par "DESC" (pour moi c'est par défaut sur ASC, et je ne trouve pas pourquoi)1 inconvénient par rapport à la fonction originelle :=> c'est un peu long à afficher sur une grosse boutique. A voir pour une amélioration qui limiterait la recherche dans le temps (par exemple, les 2 ou 3 derniers mois)On peut probablement optimiser la requête, je n'ai pas encore pris le temps de regarder pour limiter la recherche aux champs expressément utiles, voire enlever des jointures sur des tables inutiles. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now