Problème avec une jointure SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec une jointure SQL

Re: Problème avec une jointure SQL

par ouckileou » 30 sept. 2009, 20:16

Bon franchement j'ai survolé. Déjà je t'invite à lire le lien que je t'ai indiqué dans mon premier message, tu verras qu'il faut nous fournir ici du SQL, et non du PHP qui va générer du SQL. Comment pouvons-nous savoir ce qu'il y a dans tes variables ?
:arrow: sql-bases-donnees/php-sql-etapes-suivre ... 19378.html

Si tu veux avoir les panier du dernier modifié au plus ancien, un tri sur la date de mise à jour me paraît le plus logique. Un ID, c'est fait pour identifier, pas plus.

Ensuite, essaie de sortir les paniers (et les autres infos liées) de ton client, triés dans l'ordre chronologique décroissant. A partir de là, un simple LIMIT devra faire l'affaire et te renvoyer uniquement le dernier.

Donc donnes-nous le SQL généré par cette requête, ainsi que ses résultats :
      SELECT u.id_customer, u.firstname, u.lastname, c.ip_address, c.date_add, c.http_referer, c.id_connections, c.id_guest, ct.id_cart
      FROM `connections` c
      LEFT JOIN `connections_page` cp ON c.id_connections = cp.id_connections
      INNER JOIN `guest` g ON c.id_guest = g.id_guest
      INNER JOIN `customer` u ON u.id_customer = g.id_customer
      INNER JOIN `'page` p ON p.id_page = cp.id_page
      LEFT JOIN `cart` ct ON ct.id_customer = u.id_customer ( ICI JE RéCUPèRE L'ID DU PANIER )
      WHERE c.`date_add` BETWEEN '.ModuleGraph::getDateBetween().'
      '.( $http_referer ? 'AND c.http_referer LIKE \''.$http_referer.'\'' : '' ).'
      '. ( $showstep == 'error' ? 'AND p.id_page_type = 8' : ( $showstep == 'anypage' ? '' : 'AND p.id_page_type = 3 AND p.'.$showstep.'' )) .'
      GROUP BY c.id_connections
      ORDER BY '.$orderbyobject.' '.$orderby.'
      '.($limit == 1 ? 'LIMIT '.(($page*$resultperpage)-$resultperpage).', '.$resultperpage : '').''
On pourra plus facilement débugger, et toi tu pourras tester directement dans MySQL avant d'intégrer dans ton code PHP la requête qui marchera.

Ah oui, et utilise le bouton
 quand tu colles du code :)

Re: Problème avec une jointure SQL

par Raph5959 » 30 sept. 2009, 19:18

Bonjour ouckileou,

Tout d'abord merci de ta réponse.

J'ai volontairement simplifié le tout car il faut que j'arrive à sortir le panier le plus récent seulement avec la condition ON qui se situe après le JOIN de la table panier, car la conditions WHERE par la suite est utilisé pour le reste du résultat, mais bon je vais tout faire apparaître pour être plus clair, car ce n'est pas juste une requête que je fait pour sortir l'ID d'un panier, mais j'utilise une requête déjà existante, donc j'inclus une colonne ou je veux l'ID du panier client, car c'est un module de statistique que j'ai créé, ou je veux avoir l'ID du dernier panier rempli par le client pour ensuite faire un lien... c'est juste que pour le moment, de la façon dont je fait, ca me sort le premier panier créé par le client, pas le dernier :s

En réalité ma vrai table contient en effet une colonne date, même 2 en réalité, une qui indique la date de création du panier, une autre qui indique la date de mise à jour du panier, moi je ne voudrais seulement que la plus récente, donc avec l'ID la plus haute...

Voici ma vrai requête..

Code : Tout sélectionner

SELECT u.id_customer, u.firstname, u.lastname, c.ip_address, c.date_add, c.http_referer, c.id_connections, c.id_guest, ct.id_cart FROM `connections` c LEFT JOIN `connections_page` cp ON c.id_connections = cp.id_connections INNER JOIN `guest` g ON c.id_guest = g.id_guest INNER JOIN `customer` u ON u.id_customer = g.id_customer INNER JOIN `'page` p ON p.id_page = cp.id_page LEFT JOIN `cart` ct ON ct.id_customer = u.id_customer ( ICI JE RéCUPèRE L'ID DU PANIER ) WHERE c.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' '.( $http_referer ? 'AND c.http_referer LIKE \''.$http_referer.'\'' : '' ).' '. ( $showstep == 'error' ? 'AND p.id_page_type = 8' : ( $showstep == 'anypage' ? '' : 'AND p.id_page_type = 3 AND p.'.$showstep.'' )) .' GROUP BY c.id_connections ORDER BY '.$orderbyobject.' '.$orderby.' '.($limit == 1 ? 'LIMIT '.(($page*$resultperpage)-$resultperpage).', '.$resultperpage : '').''
La seul chose que j'ai réussi à faire pour le moment, c'est de remplacer la ligne ou je récupère la panier par ceci

Code : Tout sélectionner

LEFT JOIN `cart` ct ON ( ct.id_customer = u.id_customer AND ct.`date_upd` BETWEEN '.ModuleGraph::getDateBetween().')
En faisans ca, ca ne choisi plus l'ID du premier panier créé, mais plutôt l'ID du panier qui a été modifié pendant la période choisi BETWEEN, mais je préférerai avoir plutot le dernier panier (soit en ID, soit en date peu importe le résultat reviens au même)

oulala je ne sais pas si c'est très clair ce que je dit...

Re: Problème avec une jointure SQL

par ouckileou » 30 sept. 2009, 18:16

Tu veux trier sur les ID panier, et dans ta requête on lit "Selon option choisie". Peux-tu nous montrer la requête SQL effective ? Là tu nous demandes de deviner...

Avec ORDER BY et LIMIT, tu devrais facilement y arriver. Pour apprendre à bien débugguer du SQL avec du PHP, tu as un post-it en haut de ce forum.

J'ajouterais que personnellement, et comme beaucoup d'autres, je n'utiliserais pas l'ID pour ce qui semble être un tri chronologique, mais plutôt une colonne de date, celle de dernière modification du panier par exemple.

Problème avec une jointure SQL

par raph5959 » 30 sept. 2009, 13:29

Bonjour tout le monde,

J'ai un problème avec une jointure SQL et je n'arrive pas à trouver de solution....

J'ai 2 table

Code : Tout sélectionner

-------------- | client | -------------- | id | prenom | ---- ---------- | 1 | Albert | | 2 | Fred | | 3 | Robert | ---------------- --------------------- | panier | --------------------- | id_panier | prenom | ---------------------- | 2 | Fred | | 3 | Robert | | 4 | Fred | ----------------------
J'ai une requête SQL déjà existante, donc j'ajoute un JOIN pour ajouter la table "panier".

Ce qui m'interesse de ressortir comme donnée, c'est le dernier id_panier d'un client, donc dans cet exemple le 4, mais le problème c'est qu'avec la jointure, il me met automatiquement la première qu'il rencontre, soit le 2...

Voici ma requête

Code : Tout sélectionner

SELECT p.id_panier FROM client c LEFT JOIN panier p ON c.prenom = p.prenom WHERE (selon option choisi par le client) ORDER BY (selon option choisi)
Donc voilà, à savoir que je suis contraint d'utiliser une requête déjà existante plus complexe, mais je n'ai ressorti que ce qui m'interesse, c'est à dire le LEFT JOIN de la table "panier"..

J'ai essayé des truc du genre

Code : Tout sélectionner

SELECT p.id_panier FROM client c LEFT JOIN panier p ON ( c.prenom = p.prenom ORDER BY p.id_panier DESC ) WHERE (selon option choisi par le client) ORDER BY (selon option choisi)
Mais là plus rien ne s'affiche... bon en même temps j'ai fait ca par déduction donc j'imagien que ceci n'existe pas :p

Merci éventuellement pour votre aide, si je n'ai pas été assez clair dans mes explications juste à me le mentionner :)