schattenburg Posted February 29, 2016 Share Posted February 29, 2016 Hola a todos:Estoy creando mi primera SQL interna en una clase. Mi código es el siguiente: $dias = 80; $listIds = Cart::getIdsCarritosAbandonadosFull($dias); Y luego en la clase cart.php tengo: // **************************************************** public static function getIdsCarritosAbandonadosFull($dias) { $listIds = ""; $sql = "select id_cart from ps_cart where date_add BETWEEN (date_sub(NOW(), INTERVAL ".$dias." DAY)) AND NOW()"; if ($results = Db::getInstance()->ExecuteS($sql)) { foreach ($results as $row) { if (Cart::getTotalCart($row['id_cart'], true, Cart::BOTH_WITHOUT_SHIPPING) != '0,00 €') { $listIds .= $row['id_cart'].","; } } } $listIds = substr($listIds, 0, -1); // quitar última coma return $listIds; } Todo me funciona perfectamente. Me devuelve los ids de los últimos 80 días. El problema es que tarda muchísimo en devolvermelo, por lo menos 25 ó 30 segundos, y estoy seguro que es porque en Prestashop se pueden optimizar las SQL de alguna manera para que las ejecute más rápido. Sospecho que no se hace con el Select de toda la vida porque por lo que he visto por ahí en otras funciones hace SQL de esta forma: $this->_select = "..." $this->_join = "..." $this->where = ".." Y me pregunto si eso tendrá algo que ver para que las SQL se ejecuten internamente más rápido. ¿Cómo podría optimizar yo mi función para que no tarde tantísimo en devolver los valores? Muchas gracias Link to comment Share on other sites More sharing options...
FranIFS Posted February 29, 2016 Share Posted February 29, 2016 Si la base de datos no tiene inconsistencias y además está optimizada, creo que el problema está mas bien enfocado en la parte del servidor, aunque sin verlo no lo sabría... Link to comment Share on other sites More sharing options...
schattenburg Posted February 29, 2016 Author Share Posted February 29, 2016 Sí, en el phpmyadmin ya lo probé, tarda apenas 4 segundos en ejecutarse, por eso pienso que es problema de que en Prestashop se puede optimizar la SQL para obtener los resultados tan rápidos como en el phpmyadmin. Link to comment Share on other sites More sharing options...
Enrique Gómez Posted February 29, 2016 Share Posted February 29, 2016 El problema es que estas llamando X veces a Cart::getTotalCart y esta función ya de por sí es costosa a nivel de SQL ya que llama al cálculo de precio de cada producto (getPriceStatic)... y esto, por desgracia, es muy costoso. También ten en cuenta que en tu servidor localhost es posible que vaya mucho mas lento que en el hosting (optimización MysQL) Lo suyo es mirar otra estrategia y plantearte hacer la sql entera tu mismo, ya que al buscar carritos vacíos puedes mirar filas de ps_cart que no tengan ps_cart_items 2 Link to comment Share on other sites More sharing options...
schattenburg Posted February 29, 2016 Author Share Posted February 29, 2016 No entiendo lo que quieres decir con mirar las filas de ps_cart que no tengan ps_cart_items pues en ps_cart no hay ningún campo llamado items ni ps_cart_items. ¿A qué te refieres exactamente? Link to comment Share on other sites More sharing options...
Enrique Gómez Posted February 29, 2016 Share Posted February 29, 2016 Las tablas son ps_cart y ps_cart_product (no items, perdona) si lanzas SELECT distinct c.id_cart FROM ps_cart c join ps_cart_product cp on c.id_cart=cp.id_cart WHERE 1 veras que sacas ids de carritos con productos, por lo que se entiende que su importe no es 0. Luego ya es cuestión de filtrar por fecha Link to comment Share on other sites More sharing options...
schattenburg Posted February 29, 2016 Author Share Posted February 29, 2016 Muchas gracias, me ha servido de mucho lo que me has dicho. 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