Superbegood31 Posted April 14, 2016 Share Posted April 14, 2016 Bonjour, Je recherche une requête SQL pour afficher tous les produits classés par fournisseur par date de commande client. En gros, je souhaite regrouper tous les produits commandés par les clients par fournisseurs. J'ai essayé ceci ci-dessous mais sans succès... SELECT p.`id_product`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity` FROM `ps_product` p, `ps_order_detail` od LEFT JOIN `ps_orders` o ON (od.`id_order` = o.`id_order`) LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 1) INNER JOIN `ps_product_supplier` ps ON (ps.`id_product` = p.`id_product` AND ps.`id_supplier` = 2) GROUP BY p.`id_supplier`; Merci de votre aide Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 14, 2016 Author Share Posted April 14, 2016 J'ai cette erreur SQL #1054 - Unknown column 'p.id_product' in 'on clause' pour cette requête : SELECT p.`id_product`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity`, s.`name` FROM `ps_product` p, `ps_supplier` s, `ps_orders` o LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 1) LEFT JOIN `ps_order_detail` od ON (o.`id_order` = od.`id_order`) INNER JOIN `ps_product_supplier` ps ON (ps.`id_product` = p.`id_product` AND ps.`id_supplier` = 2) GROUP BY p.`id_supplier`; Pourtant la colonne id_product existe bien dans la table product (p)... Link to comment Share on other sites More sharing options...
Eolia Posted April 14, 2016 Share Posted April 14, 2016 Quelque chose comme ça devrait vous convenir^^ SELECT p.`id_product`, s.`name`, p.`reference`, p.`ean13`, pl.`name`, SUM(od.`product_quantity`) as Quantity FROM `ps_product` p INNER JOIN `ps_order_detail` od ON (p.id_product = od.product_id) INNER JOIN `ps_orders` o ON (od.`id_order` = o.`id_order`) INNER JOIN `ps_product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = 1) INNER JOIN `ps_product_supplier` ps ON (ps.`id_product` = p.`id_product`) INNER JOIN `ps_supplier` s ON (s.`id_supplier` = ps.`id_supplier`) -- AND ps.`id_supplier` = 2 GROUP BY p.`id_product` ORDER BY s.`name`, p.`id_product` ASC; J'ai mis le supplier en commentaire, autrement vous n'aurez les résultats que pour celui-ci Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 14, 2016 Author Share Posted April 14, 2016 Salut et merci Eolia, Ta requête fonctionne bien, un grand merci. L'idée est de générer un PDF (sur la base des bons de livraison) par fournisseur listant tous les produits commandés par les clients (en mode dropshipping). Vais maintenant m'attaquer au code pour arriver à ce résultat. Merci encore Eolia. Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 14, 2016 Author Share Posted April 14, 2016 En fait cette requête fonctionne bien mais ne remplit pas mon objectif... Je vais continuer à creuser. Pour rappel : je souhaite faire une liste de tous les produits commandés pour chaque fournisseurs Exemple: on m'a commandé 10 sacs de sables et que ces 10 sacs de sables sont répartis chez 3 fournisseurs (fourn1: 1 ; fourn2: 4; fourn3: 5) Fournisseur/Produit commandé/Qté fourn1/sac de sable/1 fourn2//sac de sable/4 fourn3//sac de sable/5 Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 15, 2016 Author Share Posted April 15, 2016 Bonjour à tous, La fonction que je souhaite modifier est getByDeliveryDateInterval du fichier /classes/order/OrderInvoice.php public static function getByDeliveryDateInterval($date_from, $date_to) { $order_invoice_list = Db::getInstance()->executeS(' SELECT oi.* FROM `'._DB_PREFIX_.'order_invoice` oi LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = oi.`id_order`) WHERE DATE_ADD(oi.delivery_date, INTERVAL -1 DAY) <= \''.pSQL($date_to).'\' AND oi.delivery_date >= \''.pSQL($date_from).'\' '.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').' ORDER BY oi.delivery_date ASC '); return ObjectModel::hydrateCollection('OrderInvoice', $order_invoice_list); } Et j'aimerai l'adapter avec cette requette SQL : SELECT DISTINCT o.`order_id`, od.`product_id`, s.`name`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity` FROM `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = oi.`id_order`) INNER JOIN `'._DB_PREFIX_.'order_detail` od ON (p.id_product = od.product_id) INNER JOIN `'._DB_PREFIX_.'orders` o ON (od.`id_order` = o.`id_order`) INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = 1) INNER JOIN `'._DB_PREFIX_.'product_supplier` ps ON (ps.`id_product` = p.`id_product`) INNER JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`) WHERE DATE_ADD(oi.delivery_date, INTERVAL -1 DAY) <= \''.pSQL($date_to).'\' AND oi.delivery_date >= \''.pSQL($date_from).'\' '.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').' GROUP BY od.`product_id` ORDER BY s.`name`, od.`product_id` ASC Dans l'état j'ai le droit à une belle page blanche... Link to comment Share on other sites More sharing options...
coeos.pro Posted April 15, 2016 Share Posted April 15, 2016 Active les messages d'erreur, et renomme 1 name, la tu en as 2 Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 15, 2016 Author Share Posted April 15, 2016 (edited) Bonjour coes et merci de ton retour. Pour les messages d'erreurs je vais activer le debug. Mais pour les name, je ne vois pas. En fait le name est sur deux tables (s.name = nom du fournisseur et pl.name = nom du produit). Et voici les erreurs : [PrestaShopDatabaseException] Not unique table/alias: 'o' SELECT DISTINCT o.`order_id`, od.`product_id`, s.`name`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity` FROM `ps_product` p LEFT JOIN `ps_orders` o ON (o.`id_order` = oi.`id_order`) INNER JOIN `ps_order_detail` od ON (p.id_product = od.product_id) INNER JOIN `ps_orders` o ON (od.`id_order` = o.`id_order`) INNER JOIN `ps_product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = 1) INNER JOIN `ps_product_supplier` ps ON (ps.`id_product` = p.`id_product`) INNER JOIN `ps_supplier` s ON (s.`id_supplier` = p.`id_supplier`) WHERE DATE_ADD(oi.delivery_date, INTERVAL -1 DAY) <= '2016-04-15' AND oi.delivery_date >= '2016-04-14' AND o.id_shop IN (1) GROUP BY od.`product_id` ORDER BY s.`name`, od.`product_id` ASC at line 791 in file classes/db/Db.php 786. if ($webservice_call && $errno) { 787. $dbg = debug_backtrace(); 788. WebserviceRequest::getInstance()->setError(500, '[SQL Error] '.$this->getMsgError().'. From '.(isset($dbg[3]['class']) ? $dbg[3]['class'] : '').'->'.$dbg[3]['function'].'() Query was : '.$sql, 97); 789. } elseif (_PS_DEBUG_SQL_ && $errno && !defined('PS_INSTALLATION_IN_PROGRESS')) { 790. if ($sql) { 791. throw new PrestaShopDatabaseException($this->getMsgError().'<br /><br /><pre>'.$sql.'</pre>'); 792. } 793. 794. throw new PrestaShopDatabaseException($this->getMsgError()); 795. } 796. } DbCore->displayError - [line 425 - classes/db/Db.php] - [1 Arguments] DbCore->query - [line 643 - classes/db/Db.php] - [1 Arguments] DbCore->executeS - [line 656 - classes/order/OrderInvoice.php] - [1 Arguments] OrderInvoiceCore::getByDeliveryDateInterval - [line 121 - controllers/admin/AdminDeliverySlipController.php] - [2 Arguments] AdminDeliverySlipControllerCore->postProcess - [line 178 - classes/controller/Controller.php] ControllerCore->run - [line 367 - classes/Dispatcher.php] DispatcherCore->dispatch - [line 58 - admin/index.php] Edited April 15, 2016 by Superbegood31 (see edit history) Link to comment Share on other sites More sharing options...
coeos.pro Posted April 15, 2016 Share Posted April 15, 2016 SELECT DISTINCT o.`order_id`, od.`product_id`, s.`name`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity` il faut mettre par exemple : SELECT DISTINCT o.`order_id`, od.`product_id`, s.`name` AS `fournisseur`, p.`reference`, p.`ean13`, pl.`name`, od.`product_quantity` Link to comment Share on other sites More sharing options...
Eolia Posted April 15, 2016 Share Posted April 15, 2016 Euh.... rien à voir et ce n'est pas bloquant ça, juste qu'il y aura 2 colonnes 'name' Le problème vient surtout que vous faites 2 join sur la même table ps_order avec 'o' en alias... Link to comment Share on other sites More sharing options...
Eolia Posted April 15, 2016 Share Posted April 15, 2016 2ème point, quand vous effectuez des JOIN il y a un ordre logique que vous ne suivez pas: FROM `ps_product` p LEFT JOIN `ps_orders` o ON (o.`id_order` = oi.`id_order`) Sauf que là oi.`id_order` n'existe pas encore, donc vous avez mis un LEFT JOIN pour ramener tout (y compris les NULL) Il va falloir bosser un peu le SQL... Link to comment Share on other sites More sharing options...
coeos.pro Posted April 15, 2016 Share Posted April 15, 2016 juste qu'il y aura 2 colonnes 'name' oui ce n'est pas ça qui provoque la page blanche non, ça c'est impossible, Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 15, 2016 Author Share Posted April 15, 2016 Il va falloir bosser un peu le SQL... C'est clair En tous les cas, je vous remercie pour votre aide. Je vais continuer mes recherches pour arriver à cette fonction qui je pense pour aider plusieurs personnes. Link to comment Share on other sites More sharing options...
Superbegood31 Posted April 15, 2016 Author Share Posted April 15, 2016 Message pour Coeos.pro : Rien à voir avec le sujet mais est-il possible de changer mon mail sur mon profil car je ne reçois plus les notifications (ancien mail plus valide) ? Merci Link to comment Share on other sites More sharing options...
bathie Posted July 6, 2016 Share Posted July 6, 2016 bonjour est ce que quelqu'un a pu résoudre ce problème ? je suis gravement intéressé par ce cas de figure je suis bosse actuellement sur le même problématique et je suis bloqué dessus depuis 2 jours... merci de votre aide 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