Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Fonctionnement _ boxe produits déjà acheté qui tient compte de toutes les commandes d'un meme client

Écrit par : bobohh 23 Jul 2007, 12:00

bonjour ,pour l'instant seuls les produits achetés lors d'une meme commande seront dans cette boxe.
Réponse dans le dernier message

Écrit par : shoprun 23 Jul 2007, 12:55

Salut

(toujours avec ce module je vois biggrin.gif )

Bon, que ça marche, je veux bien, mais ta modif me laisse un peu perplexe.

En gros, tu dis (dans la requete) que tu veux :
les produits = l'id du produit courant
ET les produits différents l'id du produit courant.

Pour moi ça revient au même de ne rien mettre, non?

En somme tu veux tous les produits achetés dans la limite du MAX_DISPLAY_ALSO_PURCHASED, non ?

Dans cette condition la requête peut être plus simple.

Écrit par : bobohh 23 Jul 2007, 15:00

bon je pense avoit trouver.La nuit porte conseil pour tenir compte des achats précédents

CODE
$orders_query = tep_db_query("SELECT   p.products_id,  p.products_image FROM
  products p,  " . TABLE_ORDERS . " a,  " . TABLE_ORDERS . " b, " . TABLE_ORDERS_PRODUCTS . " opa," . TABLE_ORDERS_PRODUCTS . " opb WHERE  opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . " AND   opa.orders_id = a.orders_id AND   a.customers_name = b.customers_name AND   b.orders_id = opb.orders_id AND   opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . " AND   opb.products_id = p.products_id AND   p.products_status = '1' GROUP BY  p.products_id ORDER BY  b.date_purchased DESC limit " . MAX_DISPLAY_ALSO_PURCHASED);


Qu'en penses tu Shoprun ?


Écrit par : shoprun 25 Jul 2007, 11:15

Tu as quelque peux modifier ton premier post, et maintenant j'ai un doute sur ce que tu souhaite obtenir comme résultat.
Qu'entends tu par : ...pour l'instant seuls les produits achetés lors d'une meme commande.

Ceci dit, je vois que tu souhaite récupérer tous les produits commandés excepté celui du produit courant.

En premier, cette requête m'a toujours parue un peu bizarre, car elle y fait appelle à 2 fois la même table orders et orders_products, par moment c'est utile, mais je ne pense pas que cela le soit ici.
->TABLE_ORDERS . " a, " . TABLE_ORDERS . " b

Un petit détail, évite de mettre en dur le nom de la table : products p
Il est mieux de respecter le principe d'osC qui est d'utiliser les constantes -> TABLE_PRODUCTS

Voilà une requête que j'ai une peu remanié.
J'y est rajouter un DISTINCT ce qui évite de faire un GROUP BY
Fais y un test, mais je l'ai fais sur phpmyadmin, ça a l'air correcte.

CODE
$best_sellers_query = tep_db_query("SELECT DISTINCT p.products_id, p.products_image
    FROM ".TABLE_PRODUCTS." p,
    ".TABLE_ORDERS." o,
    ".TABLE_ORDERS_PRODUCTS. " op
    WHERE o.orders_id = op.orders_id
    AND op.products_id = p.products_id
    AND op.products_id <> ".(int)$HTTP_GET_VARS['products_id']."
    AND p.products_status = '1'
    GROUP BY p.products_id
    ORDER BY o.date_purchased DESC
    LIMIT ".MAX_DISPLAY_ALSO_PURCHASED);


Bon code cool.gif

Écrit par : bobohh 25 Jul 2007, 11:39

on va repartir du début

CODE
select p.products_id, p.products_image from " . TABLE_ORDERS_PRODUCTS . " opa, " . TABLE_ORDERS_PRODUCTS . " opb, " . TABLE_ORDERS . " o, " . TABLE_PRODUCTS . " p

where opa.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and opa.orders_id = opb.orders_id and opb.products_id != '" . (int)$HTTP_GET_VARS['products_id'] . "' and opb.products_id = p.products_id and opb.orders_id = o.orders_id and p.products_status = '1' group by p.products_id order by o.date_purchased desc limit " . MAX_DISPLAY_ALSO_PURCHASED


au début quand j'ai juste enlevé
CODE
opa.orders_id = opb.orders_id
, je n'avais pas compris ce que faisait cette requete.

en fait je pense avoir bien compris car l'utilisation des alias de tables n'est pas dû au hasard et permet des croisements

opa.products_id recupère le produit_id qu'on affiche
CODE
opa.orders_id = opb.orders_id
et l'orders_id du produit récupéré au dessus doit etre égal à l'orders_id d'opb (2ème table alias)
CODE
opb.products_id != '" . (int)$HTTP_GET_VARS['products_id'] . "'
mais celui-ci aura un produit_id différent donc cela ne peut être qu'un MEME ordre d'achat (orders_id) que l'on retrouve dans la table orders ou on a seulement les ordres
CODE
opb.products_id = p.products_id
devient le produit que l'on veut afficher dans la boxe , soit meme orders_id et products_id différent de la variable url.

toi tu as fait

CODE
$best_sellers_query = tep_db_query("SELECT DISTINCT p.products_id, p.products_image
    FROM ".TABLE_PRODUCTS." p,
    ".TABLE_ORDERS." o,
    ".TABLE_ORDERS_PRODUCTS. " op
    WHERE o.orders_id = op.orders_id
    AND op.products_id = p.products_id
    AND op.products_id <> ".(int)$HTTP_GET_VARS['products_id']."
    AND p.products_status = '1'
    GROUP BY p.products_id
    ORDER BY o.date_purchased DESC
    LIMIT ".MAX_DISPLAY_ALSO_PURCHASED);


ça marche mais en fait ça affiche tous les produits dont le products_id est différent de la variable url products_id
donc pour moi pas bon car je veux afficher tous les produits d'un meme client ce qui est le principe de cette boxe.

moi:
CODE
$orders_query = tep_db_query("SELECT   p.products_id,  p.products_image FROM
  ".TABLE_PRODUCTS." p,  " . TABLE_ORDERS . " a,  " . TABLE_ORDERS . " b, " . TABLE_ORDERS_PRODUCTS . " opa," . TABLE_ORDERS_PRODUCTS . " opb

WHERE  opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . " AND   opa.orders_id = a.orders_id AND   a.customers_name = b.customers_name AND   b.orders_id = opb.orders_id AND   opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . " AND   opb.products_id = p.products_id AND   p.products_status = '1' GROUP BY  p.products_id ORDER BY  b.date_purchased DESC limit " . MAX_DISPLAY_ALSO_PURCHASED);


je pense que 2 alias en plus(TABLE_ORDERS) sont nécessaires des 2 déjà précedents avec TABLE_ORDERS_PRODUCTS
CODE
opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . "
recup de products_id d'opa
CODE
opa.orders_id = a.orders_id

CODE
a.customers_name = b.customers_name
les 2 alias de orders me semblent indispensables pour pouvoir repartir avec le meme nom vers la table TABLE_ORDERS_PRODUCTS
CODE
opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . "
et récupérér les produits de la meme personne mais avec un 'products_id différent .

voilà
Ceci explique pourquoi au début je n'arrrivais pas à afficher cette boxe tant que je n'avais pas mis plusieurs articles dans mon panier

Ton avis

Écrit par : shoprun 25 Jul 2007, 18:06

Re

Je ne saisie pas ton raisonnement (voir entêtement) à vouloir y mettre 2 fois les même tables. Ce genre d'artifices sont par moment indispensable, mais dans ton cas je n'en vois pas du tout l'utilité.
Ce qui fait que tu as des conditions assez contradictoire dans la requête, et MySQL risque d'en perdre son latin ...

Les cas ou l'on appel 2 fois la même table sont rares.
Dans mon osC j'en n'ai qu'un seul, c'est pour le parrainage -> le parrain et le filleul (récup de données de 2 personnes différentes dans la même table customers).
Mais là, on est pas du tout dans ce cas particulier.

Puis il y a quelque chose qui m'échappe, je cite :
récupérér les produits de la meme personne mais avec un 'products_id différent.
Si tu souhaite obtenir les produits du client qui vient tout juste de faire une commande, faudrait dans ce cas faire une jointure sur son identifiant (customers_id).

Puis tu fais une jointure des table a.orders et b.orders en utilisant cette condition :

CITATION
a.customers_name = b.customers_name
C'est franchement pas bon, car si le hasard faisait que tu ais 2 noms identiques (même si les probabilité sont très faibles), alors là ???
Une jointure doit ce faire uniquement sur des identifiants, dans ton cas ici ça serait : a.orders_id = b.orders_id

Puis justement, c'est à cause de cette équivalence qui pour moi est une incohérence.
Du coup, on ne parvient pas à savoir exactement ce que tu souhaite obtenir comme résultat.


Bref, si tu souhaite obtenir une aide, je pense qu'il serait mieux que tu pose exactement et du mieux possible ce que tu souhaite.
Un problème bien posé c'est pour ainsi dire déjà le résoudre.

Essai de poser de le problème de cette manière :
Je veux tous les id des produit et leur images
(Pour les tables on verra après)

Et les conditions (les clauses plus exactement dans le langages SQL)
1/ Dont les produits sont différents du produit courant -> <> $HTTP_GET_VARS['products_id']
2/ Dont le status des produits sont valident -> products_status = 1
Voilà les 2 seules conditions que je vois dans ta requête.
Pour le reste je ne parviens pas voir à quoi ils servent ?

Puis les autre options :
Dont l'ordre sera classé par date de commande décroissante -> date_purchased desc
Dans la limite de x -> MAX_DISPLAY_ALSO_PURCHASED


Puis autre chose encore, c'est que tu parle souvent d'alias, je pense que tu veux plutôt dire Jointure.
Un alias c'est juste une syntaxe courte quand on fait une référence à une table par exemple.
Au lieu de saisir products.products_id, on mets p.products_id car on a explicitement déclaré cet alias dans le FROM.
Quand on met cette condition : op.products_id = p.products_id c'est une jointure qui devra s'opérer entre ces 2 tables.


Une dernière petite chose.
C'est pas parce qu'une requête ne plante pas qu'elle est correcte, je dirais que c'est le pire qui peut arriver, car débugger un truc qui marche c'est par moment assez déroutant.
Il y a des millions d'euros qui partent je ne sais où dans la nature uniquement à causes de requêtes mal fichues confused.gif


Bref, pose bien ton problème, sans cela il te sera difficile d'obtenir une aide.


cool.gif

Écrit par : bobohh 25 Jul 2007, 19:27

CODE
$orders_query = tep_db_query("SELECT   p.products_id,  p.products_image FROM
  products p,  " . TABLE_ORDERS . " a,  " . TABLE_ORDERS . " b, " . TABLE_ORDERS_PRODUCTS . " opa," . TABLE_ORDERS_PRODUCTS . " opb WHERE  opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . " AND   opa.orders_id = a.orders_id AND   a.customers_id = b.customers_id AND   b.orders_id = opb.orders_id AND   opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . " AND   opb.products_id = p.products_id AND   p.products_status = '1' GROUP BY  p.products_id ORDER BY  b.date_purchased DESC limit " . MAX_DISPLAY_ALSO_PURCHASED);


j'ai remplacé par customers_id (identifiant du client) au lieu de customers_name et pas orders_id car orders_id est l'identifiant de l'acte d'achat .

Les alias je les définis comme toi , ce sont a, b opa et opb qui dédoublent les tables.

Merci Shoprun

deux petites questions encore :
-je cherche des infos sur l'utlisation Lieux / Taxes Pays Zones Zones fiscales Classes fiscales Taux fiscaux
, n'étant pas un commercial de formation
j'ai trouvé http://www.oscommerce-fr.info/faq/qa_info.php?qID=66
mais ça neme parait pas suffisant en explications si l'on souhaite vendre en Europe ou dans le monde entier.
De plus il y a un module virement bancaire et j'aimerais trouver des explications clairs sur Numero IBAN 0000-0000-0000-0000-0000-0000-000 et
Code Identification Bancaire BIC_SWIFT
00000000000

Pour le No. du compte bancaire , ça va ,je sais ce que c'est.

Merci pour tout


Écrit par : shoprun 25 Jul 2007, 20:54

En premier on est dans la même bouse -> on est pas des commerciaux
Je suis électrotech de base / formation, est quasi aucune expérience dans le commerce (Ze l'aventure dans peu de temps)

Puis pour les pays zone, j'ai suivi ce même post, et je pense quand même si les explications sont courtes, cela permet de bien construire sa base à ce niveau.
Puis je ne vois pas trop ce qui te parait pas clair, dans ce cas il serait mieux de dire qu'elles sont les points sombres car je doute fort de pouvoir donner de meilleures explications que sur ce post.

Aussi, je me suis jamais poser de questions sur les signification des différents code sur les cartes bancaires, de ce coté je me reposerait sur une transaction via une banque, ce qui fait que je n'aurais jamais les numéros des cartes de mes clients.
Du coup là aussi je ne vois pas trop où tu veux en venir.


Passons enfin à cette fameuse requête.
Bien là, je crois que je vais arrêter de donner des conseils, car tu ne les suis pas du tout les conseils.
Effectivement, tu est tout à fait libre de le faire ou pas, mais à quoi bon demander de l'aide ?

En tout cas cette requête n'est pas correcte, mais alors pas du tout.
Je persiste (et je signe), il y pas pas lieu de faire appel en 2 fois aux tables orders et orders_products, mais alors pas du tout.
Ca n'est que du temps de perdu en exécution, et ça ne fait que ça.

Puis si on fait une petite réflxion, d'un coté tu dis que tu veux les produits courant :
opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . "
Puis de l'autre tu exclus les produits courants :
opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . "

opa et opb sont toutes les 2 les mêmes tables orders_products avec les mêmes données, non?
Pour moi ces instructions sont en total contradictions, ce n'est que du code perturbateur/incohérent.


Puis pour la jointure sur le customer_id, en faite je me suis mal exprimer, c'est de faire une clause sur ce customer_id que je voulais dire, c'est à dire d'utiliser l'id du client s'il est connecter :
AND customers_id = $customers_id
(j'ai lancer cela en déduction du peu d'infos que tu donne, et par rapport à cette requête (biscornue).
Mais je ne suis pas certain que ce soit ce que tu veux, cette clause ne retiendra que les commandes du client connecté (des produits en finalités).

Mais si tu souhaite conserver ces appels aux 2 tables orders, la jointure doit ce faire sur les identifiant des ces 2 tables, et leur identifiant sont orders_id :
a.orders_id = b.orders_id (comme je l'avais précisé)


Bref, comme tu n'exprime toujours pas ton besoin, il sera toujours difficile d'avancer.

Écrit par : bobohh 25 Jul 2007, 21:37

CODE
opa.products_id = " . (int)$HTTP_GET_VARS['products_id'] . "
Puis de l'autre tu exclus les produits courants :
opb.products_id <> " . (int)$HTTP_GET_VARS['products_id'] . "


c'est quand même le code de départ et je doute que ceux qui ont conçu oscommerce se soient trompés.
je ne pense pas que opa et opb contiennent les memes valeurs à un instant t .ces 2 tables alias ont les memes valeurs mais avec les alias ,la requete fait des comparaisons au sein de la meme table.C'est la base de la requete de départ qui compare des lignes et ne garde que celle qui a le meme orders_id et rejette le products_id égale à la variable .je me suis servi du meme fonctionnement mais en allant plus loin avec le customers_id qui est effectivement mieux que le customers_name

Prends tout simplement une version Ms2 de base , ajoute 2 produits dans la boutique et la boxe ne s'affichera que quand un client aura commander au moins 2 produits lors d'une même commande sinon elle ne s'affichera jamais même si tu mets 5000 produits et qu'il y a 10000 commandes .Si une commande n'a pas plusieurs produits , cette boxe ne verra jamais le jour.

Je viens de faire un test ou 26 est un produit
CODE
SELECT
   p.products_id,
  p.products_image,
  opb.products_id,//rajout
  opa.products_id ,//rajout
  opa.orders_id,//rajout
  opb.orders_id//rajout
FROM
  products p,
  orders_products opb,
  orders_products opa,
  orders o
WHERE
  opa.products_id = 26 AND
  opa.orders_id = opb.orders_id AND
  opb.products_id <> 26 AND
  opb.products_id = p.products_id AND
  opb.orders_id = o.orders_id
GROUP BY
  p.products_id


résultat
query builder
products_id // 3
products_image //microsoft/msimpro.gif
products_id_1 //3
products_id_2 // 26
orders_id //20 -> meme achat
orders_id_1 //20 -> meme achat


de meme
CODE
SELECT
  p.products_id,
  p.products_image,
  opb.products_id,
  opa.products_id,
  opa.orders_id,
  opb.orders_id,
  a.customers_id,
  b.customers_id
FROM
  products p,
  orders_products opb,
  orders_products opa,
  orders a,
  orders b
WHERE
  opa.products_id = 26 AND
  opa.orders_id = a.orders_id AND
  a.customers_id = b.customers_id AND
  b.orders_id = opb.orders_id AND
  opb.products_id <> 26 AND
  opb.products_id = p.products_id
GROUP BY
  p.products_id


products_id /products_image/ products_id_1 /products_id_2 /orders_id /orders_id_1 /customers_id /customers_id_1
3 --microsoft/msimpro.gif --3 --26 --20 --20 --2 --2

les deux derniers 2 : meme acheteur

ici ça marche avec le meme achat (les deux 20)
mais si opa.orders_id et opb.orders_id étaient différents ça marcherait aussi .Seul l'acheteur reste identique.

smile.gifamicalement smile.gif

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)