Requete avec une jointure left right

Eléphant du PHP | 440 Messages

03 juil. 2008, 17:29

Bonjour à tous,

J'aurais besoin d'une petite aide.

Code : Tout sélectionner

CREATE TABLE `emballage` ( `id_emb` int(11) NOT NULL auto_increment, `nom_emb` varchar(50) NOT NULL, `id_four` int(11) NOT NULL, `cond_emb` int(11) default NULL, `id_conditionnement` int(30) default NULL, `pu_emb` decimal(10,5) NOT NULL COMMENT 'prix unitaire emballage', `tva_emb` decimal(3,2) default NULL, `id_conditionnement_pu` int(30) NOT NULL, `coef_emb_pdr` decimal(10,5) default NULL, `pu_emb_pdr` decimal(10,5) default NULL, `composup25_emb` varchar(30) default NULL, `date_m_emb` date default NULL, `id_emballage_type` int(11) NOT NULL, `actif_emb` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id_emb`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=75 ; -- -- Contenu de la table `emballage` -- INSERT INTO `emballage` (`id_emb`, `nom_emb`, `id_four`, `cond_emb`, `id_conditionnement`, `pu_emb`, `tva_emb`, `id_conditionnement_pu`, `coef_emb_pdr`, `pu_emb_pdr`, `composup25_emb`, `date_m_emb`, `id_emballage_type`, `actif_emb`) VALUES (1, 'Sacs P.E 450X150X700 /1500 Bleu ', 33, 1000, 3, 0.04318, 9.99, 3, 1.00000, 0.04318, '', '0000-00-00', 1, 1), (2, 'Sacs P.E 450X150X700 /1500 Blanc', 33, 1000, 3, 0.02557, 9.99, 3, 1.00000, 0.02557, '', '2008-07-03', 1, 0), (3, 'Rouleaux Scotch Pp 50Mm X 660M pr', 31, 6, 3, 5.15000, 9.99, 3, 0.00152, 0.00780, '', '0000-00-00', 1, 1), (4, 'Film Etirable Manuel 15µ 300M pr', 31, 6, 3, 4.13000, 9.99, 3, 0.00332, 0.01370, '', '0000-00-00', 1, 1), (5, 'Cerclage 12Mm*0,63', 31, 1, 3, 24.84000, 9.99, 3, 0.00026, 0.00655, '', '0000-00-00', 1, 1), (6, 'M. Alu Diam / To 231 (Chinois', 28, 600, 3, 0.12900, 9.99, 3, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (7, 'Moule À Cake Plié 203 X 93 X 5', 40, 1000, 3, 0.09460, 9.99, 3, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (8, 'Moule À Cake 640/42G', 30, 1000, 3, 0.04280, 9.99, 3, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (9, 'Moule À Cake Plié 170 X 60 X 4', 30, 1000, 3, 0.03990, 9.99, 3, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (10, 'Moule Alu 232 X 108 H60 M1100', 40, 700, 3, 0.09460, 9.99, 3, 1.00000, 0.09460, '', '2008-04-30', 1, 1), (11, 'Tourtière Basse Carton Tp277H2', 40, 600, 3, 0.12935, 9.99, 3, 1.00000, 0.12935, '', '2008-07-03', 1, 0), (12, 'Tourtière Basse Carton Tp247H2', 40, 540, 3, 0.11505, 9.99, 3, 1.00000, 0.11505, '', '2008-07-03', 1, 0), (13, 'Moule Carton 170 X 80H50', 40, 325, 3, 0.14849, 9.99, 3, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (14, 'Bobine De Plastique Bleu Pour ', 33, 12, 1, 2.89000, 9.99, 1, 0.00000, 0.00000, '', '0000-00-00', 1, 1), (15, 'Bobine De Papier Sulfurisé Pou', 34, 12, 1, 3.80000, 9.99, 1, 0.00000, 0.00000, '', '2008-07-03', 1, 0), (16, 'Etiquettes Auto.Gm Rose', 32, 12000, 3, 0.00958, 9.99, 3, 1.00000, 0.00958, '', '0000-00-00', 1, 1), (17, 'Etiquettes Auto.Gm Vertes', 32, 12000, 3, 0.00958, 9.99, 3, 1.00000, 0.00958, '', '0000-00-00', 1, 1), (18, 'Etiquettes Auto.Gm Blanche', 32, 12000, 3, 0.00894, 9.99, 3, 1.00000, 0.00894, '', '0000-00-00', 1, 1), (19, 'Etiquettes Toupargel Croissant', 32, 1500, 3, 0.02996, 9.99, 3, 0.00000, 0.00000, '', '0000-00-00', 1, 1), (20, 'Etiquettes Toupargel Pain Choc', 32, 1500, 3, 0.02996, 9.99, 3, 0.00000, 0.00000, '', '0000-00-00', 1, 1), (21, 'Etiquettes Argel Croissant', 32, 1500, 3, 0.04494, 9.99, 3, 1.00000, 0.04494, '', '0000-00-00', 1, 1), (22, 'Etiquettes Argel Pain Choco', 32, 1500, 3, 0.04494, 9.99, 3, 1.00000, 0.04494, '', '0000-00-00', 1, 1),

Code : Tout sélectionner

CREATE TABLE `inventaire_emb` ( `id_inventaire_emb` int(11) NOT NULL auto_increment, `date_inventaire_emb` date NOT NULL, `qte_inventaire_emb` decimal(10,5) NOT NULL, `id_emb` int(11) NOT NULL, `mois_inventaire_emb` int(11) NOT NULL, `annee_inventaire_emb` int(11) NOT NULL, `pu_j_inventaire_emb` decimal(10,5) NOT NULL, PRIMARY KEY (`id_inventaire_emb`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=187 ; -- -- Contenu de la table `inventaire_emb` -- INSERT INTO `inventaire_emb` (`id_inventaire_emb`, `date_inventaire_emb`, `qte_inventaire_emb`, `id_emb`, `mois_inventaire_emb`, `annee_inventaire_emb`, `pu_j_inventaire_emb`) VALUES (1, '2008-06-17', 4800.00000, 6, 5, 2008, 0.12900), (2, '2008-06-17', 3000.00000, 8, 5, 2008, 0.04280), (3, '2008-06-17', 432.00000, 4, 5, 2008, 4.13000), (4, '2008-06-17', 126.00000, 57, 5, 2008, 0.78000), (5, '2008-06-17', 126.00000, 3, 5, 2008, 5.15000), (6, '2008-06-17', 102.00000, 5, 5, 2008, 24.84000), (7, '2008-06-17', 60000.00000, 16, 5, 2008, 0.00958), (8, '2008-06-17', 96000.00000, 18, 5, 2008, 0.00894), (9, '2008-06-17', 72000.00000, 17, 5, 2008, 0.00958), (10, '2008-06-17', 15900.00000, 21, 5, 2008, 0.04494), (11, '2008-06-17', 30000.00000, 23, 5, 2008, 0.01050), (12, '2008-06-17', 60.00000, 14, 5, 2008, 2.89000), (13, '2008-06-17', 2200.00000, 55, 5, 2008, 0.35512), (14, '2008-06-17', 40000.00000, 50, 5, 2008, 0.04970), (15, '2008-06-17', 32000.00000, 1, 5, 2008, 0.04318), (16, '2008-06-17', 9000.00000, 69, 5, 2008, 0.02520), (17, '2008-06-17', 3500.00000, 71, 5, 2008, 0.03800), (18, '2008-06-17', 6930.00000, 43, 5, 2008, 0.42300), (19, '2008-06-17', 4800.00000, 45, 5, 2008, 0.56500), (20, '2008-06-17', 3840.00000, 72, 5, 2008, 0.49300), (21, '2008-06-17', 2640.00000, 41, 5, 2008, 0.28700), (22, '2008-06-17', 6000.00000, 24, 5, 2008, 5.45000), (23, '2008-06-17', 22500.00000, 26, 5, 2008, 0.01850), (24, '2008-06-17', 22.00000, 25, 5, 2008, 7.45000), (25, '2008-06-17', 5720.00000, 52, 5, 2008, 0.30600), (26, '2008-06-17', 10560.00000, 48, 5, 2008, 0.22900), (27, '2008-06-17', 350.00000, 51, 5, 2008, 1.81000), (28, '2008-06-17', 18000.00000, 33, 5, 2008, 0.02500), (29, '2008-06-17', 2400.00000, 11, 5, 2008, 0.12935), (30, '2008-06-17', 16100.00000, 10, 5, 2008, 0.09460), (31, '2008-06-17', 9180.00000, 12, 5, 2008, 0.11505), (32, '2008-06-17', 26000.00000, 63, 5, 2008, 0.01775), (33, '2008-06-17', 1200.00000, 65, 5, 2008, 0.01875), (34, '2008-06-17', 6600.00000, 67, 5, 2008, 0.02500), (35, '2008-06-17', 6600.00000, 62, 5, 2008, 0.01425), (36, '2008-06-17', 1100.00000, 64, 5, 2008, 0.01435), (37, '2008-06-17', 6400.00000, 66, 5, 2008, 0.02625), (38, '2008-06-17', 13.00000, 38, 5, 2008, 66.00000), (39, '2008-06-17', 48.00000, 37, 5, 2008, 14.67000), (40, '2008-06-18', 0.00000, 28, 5, 2008, 0.23900), (41, '2008-06-18', 0.00000, 30, 5, 2008, 0.13750),

Voici ma requete:

Code : Tout sélectionner

SELECT emballage.id_emb, nom_emb, nom_four, cond_emb, unite_conditionnement, FORMAT((qte_inventaire_emb),2) as qte_prec FROM emballage RIGHT JOIN inventaire_emb ON emballage.id_emb = inventaire_emb.id_emb INNER JOIN fournisseur ON emballage.id_four = fournisseur.id_four INNER JOIN conditionnement ON conditionnement.id_conditionnement = emballage.id_conditionnement WHERE mois_inventaire_emb ='05' AND annee_inventaire_emb ='2008' ORDER BY nom_four;
Je voudrait récupérer les informations de mon emballage , mais aussi la quantité de l'inventaire emballage.

Le problème se situe dans le cas ou j'ajoute un emballage:
- Mon emballage est rajouter dans ma base.
- je le rentre pour le mois actuel (06/2008)
- je visualise le contenue de l'inventaire avec la requête si dessus. (avec le mois précédent et le mois actuel, la requête ne concerne que le mois précédent).


Problème il ne m'affiche uniquement les emballage qui ont l'inventaire de rempli pour le mois précédent:
Exemple:

Code : Tout sélectionner

SELECT emballage.id_emb, nom_emb, nom_four, cond_emb, unite_conditionnement, FORMAT((qte_inventaire_emb),2) as qte_prec FROM emballage RIGHT JOIN inventaire_emb ON emballage.id_emb = inventaire_emb.id_emb INNER JOIN fournisseur ON emballage.id_four = fournisseur.id_four INNER JOIN conditionnement ON conditionnement.id_conditionnement = emballage.id_conditionnement WHERE mois_inventaire_emb ='05' AND annee_inventaire_emb ='2008' ORDER BY nom_four;
La requete ne m'affiche uniquement ceux qui ont l'inventaire de remplie le 05/2008. Quel paramètre je doit rajouter dans ma requete pour affiche ceux qui non pas encore d'inventaire.

Faut-il que je rajoute Une jointure en RIGHT OU LEFT JOIN?(J'ai du mal a comprendre le fonctionnement de ces jointures) Ou je doit intervenir dans la clause?

Merci d'avance pour votre aide.

guigui69

ViPHP
ViPHP | 5924 Messages

04 juil. 2008, 13:17

Le LEFT JOIN te mettra des NULL si la valeur n'existe pas dans la table jointe, donc tu pourras avoir accès à tous les emballages

Eléphant du PHP | 440 Messages

07 juil. 2008, 10:08

Ok merci j'ai essayer ceci:

Code : Tout sélectionner

SELECT emballage.id_emb, nom_emb, nom_four, cond_emb, unite_conditionnement, FORMAT((qte_inventaire_emb),2) AS qte_prec FROM emballage LEFT JOIN inventaire_emb ON emballage.id_emb = inventaire_emb.id_emb LEFT JOIN fournisseur ON emballage.id_four = fournisseur.id_four LEFT JOIN conditionnement ON conditionnement.id_conditionnement = emballage.id_conditionnement WHERE mois_inventaire_emb ='05' AND annee_inventaire_emb ='2008'

Pourtant j'ai rajouter 3 produit dans ma table emballage, et je n'ai pas fait d'inventaire pour eux (rien dans la table inventaire_emb), et il ne s'affiche pas dans la liste.

Quel erreur j'ai pu faire?

Merci d'avance

guigui69

Mammouth du PHP | 693 Messages

07 juil. 2008, 11:01

Même si ca ne dois pas être ca, tu peux toujours ajouter le nom de tes tables aux champs dans ta conditions.

ViPHP
ViPHP | 5924 Messages

07 juil. 2008, 12:51

Les conditions du WHERE portent sur quelle table ?

Eléphant du PHP | 440 Messages

07 juil. 2008, 13:41

Les conditions dans where porte sur la table inventaire_emb.

Code : Tout sélectionner

SELECT emballage.id_emb, nom_emb, nom_four, cond_emb, unite_conditionnement, FORMAT( ( qte_inventaire_emb ), 2 ) AS qte_prec FROM emballage LEFT JOIN inventaire_emb ON emballage.id_emb = inventaire_emb.id_emb LEFT JOIN fournisseur ON emballage.id_four = fournisseur.id_four LEFT JOIN conditionnement ON conditionnement.id_conditionnement = emballage.id_conditionnement WHERE inventaire_emb.mois_inventaire_emb = '04' AND inventaire_emb.annee_inventaire_emb = '2008' ORDER BY `emballage`.`id_emb` ASC
J'ai testé sur le mois 04 la ou les produit ne sont pas rentré dans l'inventaire, le résultat de la requete me ressort pas les produit rajouter récemment qui non pas d'inventaire pour le mois 04.

ViPHP
ViPHP | 5924 Messages

07 juil. 2008, 17:42

Alors c'est normal que ça ne fonctionne pas. Les produits qui n'ont pas d'inventaire auront les champs que tu testes à NULL, il faut que tu revoies tes conditions.