Problème jointure avec 3 tables

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 jointure avec 3 tables

par Didier57 » 06 juin 2007, 14:34

Merci milles fois ça fonctionne :D :D

Bon il me reste encore du boulot pour suivre tous tes conseils :shock:

par Hubert Roksor » 06 juin 2007, 14:20

Regarde ton code:
$req = mysql_query("...retiré..."); 

$result = mysql_query($req);
Tu exécutes l'équivalent de mysql_queyr(mysql_query("..."));
Vire le second mysql_query() et renomme $req en $result

par Didier57 » 06 juin 2007, 14:11

Merci de t'attarder sur mon problème.

Alors pour comprendre un peu la chose

Lorsque j'ajoute du stock à un produit
$req = mysql_query("insert into stocks values ('','$id_produit','$quantite')")
Donc ajout d'une nouvelle ligne dans la table stocks avec $quantite le nombre de produit ajouté

Lorsque je passe un commande
$req = mysql_query("insert into factures_produits values ('','$id_produit_ajout','$quantite_ajout')");
Donc ajout d'une nouvelle ligne dans la table factures_produits avec $quantite_ajout le nombre de produit ajouté (mais qui sera soustrait pour obtenir le stock du produit


Donc un produit peut avoir plusieurs ajout dans stocks et plusieurs ajout dans factures_produits


<table border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#000000" width="929">
   <tr>
      <td bgcolor="#99CCCC" align="center" width="8%"><b>Référence</b></td>
      <td bgcolor="#99CCCC" align="center" width="10%"><b>Titre</b></td>
	  <td bgcolor="#99CCCC" align="center" width="57%"><b>Description</b></td>
	  <td bgcolor="#99CCCC" align="center" width="12%"><b>Stock ajouté</b></td>
	  <td bgcolor="#99CCCC" align="center" width="13%"><b>Stock enlevé</b></td>


   </tr>
<? 
$req = mysql_query("SELECT produits.id AS id,
produits.titre AS titre, 
produits.description AS description, 
stocks.quantite AS quantite_ajoute, 
factures_produits.quantite AS quantite_enleve 
FROM produits 
Left Join stocks 
ON produits.id = stocks.ref_produit 
Left Join factures_produits 
ON produits.id = factures_produits.id_produit 
GROUP BY produits.id");

$result = mysql_query($req);
if (!$result) {
   echo "Impossible d'exécuter la requête ($req) dans la base : " . mysql_error();
   exit;
}

if (mysql_num_rows($result) == 0) {
   echo "Aucune ligne trouvée, rien à afficher.";
   exit;
}

while ($req = mysql_fetch_assoc($result)) {

$id = $req["id"];
$titre = $req["titre"];
$description = $req["description"];
$quantite_ajoute = $req["quantite_ajoute"];
$quantite_enleve = $req["quantite_enleve"];

 
   echo("<tr>
   <td bgcolor=\"#ffffff\" align=\"center\" width=\"10%\">$id</td>
   <td bgcolor=\"#ffffff\" align=\"center\" width=\"20%\">$titre</td>
   <td bgcolor=\"#ffffff\" align=\"center\" width=\"46%\">$description</td>
   <td bgcolor=\"#ffffff\" align=\"center\" width=\"46%\">$quantite_ajoute</td>

</tr>");
}
?>
</table>
Et donc là je reçois l'erreur suivante

Code : Tout sélectionner

Impossible d'exécuter la requête (Resource id #2) dans la base
Ce qui m'inquiète c'est que la requête fonctionne trés bien sous PhpMyAdmin alors pourquoi pas dans ma page :?:

Le problème ne viendrait pas de PHP (PHP Version 4.2.0) plutôt que de mysql :?:

par Hubert Roksor » 06 juin 2007, 12:59

Tu ne récupères jamais les données de la requête, c'est pour ça que ta page est vide. mysql_fetch_assoc() sert à récupérer ces données.

Pour le message d'erreur, tu dois te planter quelque part entre les noms de variables PHP et tu dois passer une ressource à la place d'une requête. Suis les indications de ce topic pour debugger un peu plus : http://www.phpfrance.com/forums/voir_sujet-19378.php

Dernière chose, il n'y a aucune clé PRIMARY sur tes tables, ce qui me paraît étrange. Quelles sont les relations entre les tables? 1 produit = 1 stock, 1 produit = plusieurs stocks ? Les colonnes qui ne peuvent pas contenir plusieurs fois la même valeur devraient être déclarées comme PRIMARY ou UNIQUE. (en gros, PRIMARY si la valeur identifie l'enregistrement, sinon UNIQUE)

par Didier57 » 06 juin 2007, 11:18

Bon j'ai fait quelques tests, on va dire pour l'instant que je ne veux afficher que la quantite ajoute et la quantite enleve sans faire de calcul pour la somme totale du stock, alors voilà ma requete
$req = mysql_query("SELECT
produits.id AS id,
produits.titre AS titre,
produits.description AS description,
stocks.quantite AS quantite_ajoute,
factures_produits.quantite AS quantite_enleve
FROM
produits
Left Join stocks ON produits.id = stocks.ref_produit
Left Join factures_produits ON produits.id = factures_produits.id_produit
GROUP BY
produits.id")
Ceci fonctionne trés bien si je lance la requete dans PhpMyAdmin, il m'affiche bien tout les produits, la quantite_ajoute et la quantite_enleve.

Par contre sur ma page rien, je recois l'erreur

Code : Tout sélectionner

Something is wrong in your syntax près de 'Resource id #2' à la ligne 1
Je comprend plus rien là :(

Au secours je me noie :D

Re: Problème jointure avec 3 tables

par Didier57 » 06 juin 2007, 00:28

Déjà merci de ta réponse on ne peut plus rapide
Déjà, ça c'est pas très bon signe, les mêmes données sont stockées sous trois noms différents. Tu devrais faire en sorte de donner le même nom aux mêmes données, en l'occurence je recommanderais "produit_id", et je préfixerais toutes les infos de produits par "produit_". Les infos sur les stocks par "stock_", etc...
Ok je ferais ça plus tard une fois que tout fonctionnera comme je veux, je pourrais m'amuser à mettre tout au propre :wink:
Pour le reste, c'est pas très lisible et je te recommanderais d'utiliser les balises

Code : Tout sélectionner

pour afficher du SQL, ou [php] pour du PHP.[/quote] Désolé j'y veillerais à l'avenir :oops: Bon alors je vais commencer par te donner la structure de mes tables [code]# # Structure de la table `factures_produits` # CREATE TABLE factures_produits ( id int(15) NOT NULL auto_increment, id_produit int(8) NOT NULL default '0', quantite decimal(20,2) NOT NULL default '0.00', KEY id (id) ) TYPE=MyISAM; # -------------------------------------------------------- # # Structure de la table `produits` # CREATE TABLE produits ( id int(8) NOT NULL auto_increment, titre varchar(35) NOT NULL default '', description text NOT NULL, KEY id (id) ) TYPE=MyISAM; # -------------------------------------------------------- # # Structure de la table `stocks` # CREATE TABLE stocks ( id int(6) NOT NULL auto_increment, ref_produit int(6) NOT NULL default '0', quantite decimal(20,2) NOT NULL default '0.00', KEY id (id) ) TYPE=MyISAM;
Ensuite j'ai bien suivi ce que tu m'a dit voilà le code
<table border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#000000" width="929">
   <tr>
      <td bgcolor="#99CCCC" align="center" width="8%"><b>Référence</b></td>
      <td bgcolor="#99CCCC" align="center" width="16%"><b>Titre</b></td>
	  <td bgcolor="#99CCCC" align="center" width="62%"><b>Description</b></td>
	  <td bgcolor="#99CCCC" align="center" width="62%"><b>Stock</b></td>


   </tr>
<? 
$req = mysql_query("select p.id AS id, p.titre AS titre, p.description AS description, s.quantite AS quantite_ajoute - SUM(f.quantite) AS quantite_stock 
from produits AS p JOIN stocks AS s ON s.ref_produit = p.id LEFT JOIN factures_produits AS f ON f.id_produit = p.id GROUP by p.id");

$id = $req["id"];
$titre = $req["titre"];
$description = $req["description"];
$quantite_stock = $req["quantite_stock"];

 
   echo("<tr>
   <td bgcolor="#ffffff" align="center" width="10%">$id</td>
   <td bgcolor="#ffffff" align="center" width="20%">$titre</td>
   <td bgcolor="#ffffff" align="center" width="46%">$description</td>
   <td bgcolor="#ffffff" align="center" width="46%">$quantite_stock</td>

</tr>");


?>
</table>
Le résultat une belle page vide :?:

J'ai bien essayé de modifier ceci
SUM(s.quantite) AS quantite_ajoute - SUM(f.quantite) AS quantite_stock 
Mais toujours pareil.

Encore merci de ton aide.

Re: Problème jointure avec 3 tables

par Hubert Roksor » 05 juin 2007, 23:23

tb_produit.id = tb_stock.ref_produit = tb_facture.id_produit
Déjà, ça c'est pas très bon signe, les mêmes données sont stockées sous trois noms différents. Tu devrais faire en sorte de donner le même nom aux mêmes données, en l'occurence je recommanderais "produit_id", et je préfixerais toutes les infos de produits par "produit_". Les infos sur les stocks par "stock_", etc...

Pour le reste, c'est pas très lisible et je te recommanderais d'utiliser les balises

Code : Tout sélectionner

pour afficher du SQL, ou [php] pour du PHP. À part ça, on va essayer de voir ce qu'on peut faire ensemble. Tu dois récupérer des données sur tes produits, ta requête ressemble alors à [code]SELECT p.id, p.titre, p.description FROM tb_produit p
On y joint "tb_stock" en utilisant (tb_produit.id = tb_stock.ref_produit) pour la jointure.

Code : Tout sélectionner

SELECT p.id, p.titre, p.description, s.quantite_ajoute FROM tb_produit p JOIN tb_stock AS s ON s.ref_produit = p.id
On y joint "tb_facture" en utilisant (tb_produit.id = tb_facture.ref_produit) pour la jointure. Puisque tous les produits n'ont pas forcément de facture associée on utilise LEFT JOIN (faire de même avec tb_produit si tous les produits n'ont pas de stock associé)

Code : Tout sélectionner

SELECT p.id, p.titre, p.description, s.quantite_ajoute, f.quantite_sortie FROM tb_produit p JOIN tb_stock AS s ON s.ref_produit = p.id LEFT JOIN tb_facture AS f ON f.ref_produit = p.id
Là tu devrais donc avec tes infos produits et les quantités associées. Le problème c'est que le résultat fait 3 kilomètres de long à cause du nombre de factures. Ce qu'on veut c'est grouper les factures par produit. (j'imagine qu'il n'y a qu'un stock par produit... ce serait plus simple si tu avais suivi les conseils affichés lors de la rédaction du sujet, à savoir poster le schéma des tables sous la forme d'un CREATE TABLE :cry:)

Code : Tout sélectionner

SELECT p.id, p.titre, p.description, s.quantite_ajoute, SUM(f.quantite_sortie) AS quantite_sortie FROM tb_produit p JOIN tb_stock AS s ON s.ref_produit = p.id LEFT JOIN tb_facture AS f ON f.ref_produit = p.id GROUP BY p.id
Reste à faire un poil de math

Code : Tout sélectionner

SELECT p.id, p.titre, p.description, s.quantite_ajoute - SUM(f.quantite_sortie) AS quantite_stock FROM tb_produit p JOIN tb_stock AS s ON s.ref_produit = p.id LEFT JOIN tb_facture AS f ON f.ref_produit = p.id GROUP BY p.id
...et on devrait arriver à ce que tu recherches. Si ça ne correspond pas, merci de détailler les résultats que la requête génère, les résultats attendus ainsi que le schéma des tables en question.

Problème jointure avec 3 tables

par Didier57 » 05 juin 2007, 22:59

Bonjour à tous,

Je vous expose les faits,

Soit 3 Tables "mysql"

tb_produit id, titre, description
tb_stock id, ref_produit, quantite_ajoute
tb_facture id, id_produit, quantite_sortie

ou tb_produit.id = tb_stock.ref_produit = tb_facture.id_produit

$quantite_stock=quantite_ajoute-quantite_sortie

Je voudrais afficher une table

tb_produit.id, tb_produit.titre, tb_produit.description, $quantite_stock

Quelqu'un pourrait-il m'aider à créer la requête car là je suis complètement perdu :(

D'avance, merci de votre aide