Page 2 of 2

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Thu Sep 24, 2015 10:48 pm
by LeorLindel
Je l'ai déjà fait, j'ai même remplacé dans la requête initiale le champ "manufacturer" par le champs "artist" ou "label" et c'est toujours le même problème.
La requête modifiée me semble correcte mais cela doit venir d'autre chose.
J'ai revérifié les tables de la BDD (artist, label, product) et il n'y a aucun souci.

Je n'y comprend plus rien.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Thu Sep 24, 2015 11:06 pm
by LeorLindel
En plus quand je crée une nouvelle fiche produit et que je rentre les infos de l'artiste et du label, la table de la base de donnée (product) se remplie bien et les champs sont bien alimentés (artist_id et label_id).

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 1:07 am
by straightlight
AND p.artist_id = '1' GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,15 AND p.artist_id = '1'
p.artist_id est localisé deux fois dans la requête. Vous devez enlever la 2e partie du: AND p.artist_id = '1' et de seulement laisser la première dans la ligne dans le cas présent.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 2:57 am
by LeorLindel
Ce dont tu cites est tiré de l'erreur générée et non de la requête envoyée.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 3:54 am
by straightlight
Le champ artist_id existe bien dans la table product? Si non, il faudrait que vous l'ajoutiez à partir de PHPMyAdmin. Cepdendant, de considérer l'idée concernant les tables additionnels pour relier les produits avec table d'artiste et la table des étiquettes seraient également une bonne idée si le même produit ou plusieurs produits devaient faire affaire aux artistes et aux étiquettes.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 4:02 am
by LeorLindel
straightlight wrote:Le champ artist_id existe bien dans la table product?
Comme je l'ai dit dans cette réponse les champs "artist_id et label_id" ont bien étés ajoutés à la table "product"
straightlight wrote:Cepdendant, de considérer l'idée concernant les tables additionnels pour relier les produits avec table d'artiste et la table des étiquettes seraient également une bonne idée si le même produit ou plusieurs produits devaient faire affaire aux artistes et aux étiquettes.
C'est bien cela que je souhaite faire en modifiant la requête initiale, relier les artistes et les labels aux produits.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 6:15 am
by straightlight
Dans la table artist, ajoutez le champ product_id ainsi que dans la table label. Assurez-vous de lier les produits correspondants envers ces deux tables.

Ensuite, supprimez les deux champs artist_id et label_id dans la table des produits et essayez plutôt cette requête:

Code: Select all

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN `" . DB_PREFIX . "artist` `a` ON (`a`.`product_id` = `p`.`product_id`) LEFT JOIN `" . DB_PREFIX . "label` la` ON (`la`.`product_id` = `a`.`product_id`) WHERE p.product_id = '" . (int)$product_id . "' AND `a`.`artist_id` = '1' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 6:31 am
by LeorLindel
J'ai ajouté le champs "product_id" dans la table "artist" et "label" et j'ai mis votre requête en remplacement de l'initiale.
J'ai testé sur l'artiste [id=2]
Résultat, j'ai une page blanche avec cette erreur dans le journal :

Code: Select all

2015-09-25 0:28:33 - PHP Notice:  Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND p.artist_id = '2'' at line 1<br />Error No: 1064<br />SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '2' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p.artist_id = '2' GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,15 AND p.artist_id = '2' in /public_html/1564/system/database/mysql.php on line 50

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 8:12 am
by straightlight
Assurez-vous que le filtre à partir du controlleur, ou sois à partir de votre fichier XML VQMod, n'utilise pas le p.artist_id dans le paramètre envers de faire appel à la méthode de getProduct. Autrement, si vous n'avez pas placé cette requête autrepart, je ne peux voir comment cette erreur peut revenir à part l'utilisation du cache que vous devrez libérer dans votre FTP et ensuite de relancer la page avec la requête fourni afin de savoir si le problème persiste.

Re: Adding LEFT JOIN in catalog/model/catalog/product.php

Posted: Fri Sep 25, 2015 4:21 pm
by LeorLindel
J'ai trouvé la solution !
N'utilisant pas la table "manufacturer" j'ai supprimé la table "artist" et ai entré les informations dans la table "manufacturer" que j'ai renommé dans le catalogue "Artiste", j'ai conservé la table "label" et ai modifié la requête ainsi :

Code: Select all

		$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, l.name AS label, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "label l ON (p.label_id = l.label_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
Et tout fonctionne.
Je vous remercie de votre aide.