Jump to content

Requête SQL pour grouper les produits par fournisseur


Recommended Posts

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

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

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

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

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

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

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 by Superbegood31 (see edit history)
Link to comment
Share on other sites

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

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

  • 2 months later...

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...