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

)
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.
[quote="Didier57"]tb_produit.id = tb_stock.ref_produit = tb_facture.id_produit[/quote]
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] 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[/code]
On y joint "tb_stock" en utilisant (tb_produit.id = tb_stock.ref_produit) pour la jointure.
[code]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[/code]
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]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[/code]
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]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[/code]
Reste à faire un poil de math
[code]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[/code]
...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.