Partage
  • Partager sur Facebook
  • Partager sur Twitter

résultat d'une 4ème table en partant de la 1ère

    27 novembre 2020 à 1:40:54

    Bonjoue à tous,

    je vous expose mon prob de requête..

    je voudrais afficher la somme d'un produit en partant de cette requete :

    afficher toutes les recettes entre 2 dates pour recuperer ses ingrédients dans une table ingredient ayant l'id du produit en question dont je veux la somme car il est possible de retrouver plusieurs fois ce produit.

    voici comment j'affiche tous mes  produits mais je n'arrive pas en faire cette p** de somme...

    mes tables

    				$query_cadd = $bdd->prepare("SELECT * FROM commandes WHERE date_menu BETWEEN ? AND ? ");
    				$query_cadd->execute(array($lun_comm,$dim_comm)); 	
    				while($cadd = $query_cadd->fetch())
    				    { //commandes	
    								
    					$query_recette = $bdd->prepare("SELECT * FROM recette WHERE id=?");
    					$query_recette->execute(array($cadd['recette']));
    					while($recette_cadd = $query_recette->fetch())
    				         {//recette
    						 
    						      $query_ingredient = $bdd->prepare("SELECT * FROM ingredient WHERE id_recette=?");
    							  $query_ingredient->execute(array($recette_cadd['id'])); 	
    							  while($ingredient_cadd = $query_ingredient->fetch())
    						           {//ingredient	
    								   												 
    													
    										 $query_produit = $bdd->prepare("SELECT * FROM rep_produits WHERE code=?");
    										 $query_produit->execute(array($ingredient_cadd['id_produit'])); 	
    										 $produit_cadd = $query_produit->fetch();
    											 								
    										            echo '-<font size="1"><b>'.$produit_cadd['produit'].'</b> : ';
    										 
    										 $quantite = $ingredient_cadd['quantite'];
    										 $calcul = 	$cadd['quantite']* $quantite;	
    										 												
                                                        echo round($calcul,1).'&nbsp;';
    										 
    										 if ($calcul > '1'){ $S ='s';}
    										 
    										 $query_mesure = $bdd->prepare("SELECT * FROM rep_mesure WHERE code=?");
    										 $query_mesure->execute(array($ingredient_cadd['mesure'])); 	
    										 $mesure_cadd = $query_mesure->fetch();
    										
    										           echo $mesure_cadd['mesure'].$S.'</font><br>';
    								   }//ingredient				 							   
    								   
    						 }//recette
    										 
    				    }//commandes

    cela donne en résultats ces fameux doublons voir triplons lol

    -Gousse De Vanille : 6 Pièces

    -Farine : 1 Grammes

    -Oeuf Frais : 10 Pièces

    -Sucre Semoule : 0.3 Grammes

    -Beurre : 0.2 Grammes

    -Lait En Brique : 1.3 Cls

    -Camembert Affiné Au Calvados : 50 Pièces

    -Haricots Verts Surgelés : 7.5 Kgs

    -Beurre : 1 Kgs

    -Steack Haché 120g : 6 Kgs

    -Ail Cat 1 : 1.5 Kgs

    -Oeuf Frais : 50 Pièces

    -Macédoine De Légumes : 1.9 Boites

    -Mayonnaise En Seau : 0.6 Pièces

    Un grand merci pour vos précieux conseils

    -
    Edité par gagg 27 novembre 2020 à 1:42:52

    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2020 à 10:20:47

      Bonjour,

      Ne jamais faire de requêtes dans une boucle, encore plus en imbriquant les boucles ... si ta base augmente en taille tu vas mettre ton serveur à genoux ... SQL propose une chose fantastique qui s'appelle jointure ... c'est un peu la base en fait ...

      Garder une cohérence dans le nom des colonnes et des table (un coup id, un coup code, c'est pas uniforme) permet de faciliter l'écriture des requêtes.

      Eviter les SELECT * et préférer renseigner seulement les colonnes dont tu as besoin pour mieux maîtriser les retours fait à ton programme.

      Si tu veux faire une somme, il faut le demander, et SQL propose justement cela avec la fonction SUM utilisée avec la clause GROUP BY ...

      Il y a tellement à dire ... je te conseille fortement la lecture du cours MySQL, du cours PHP/MySQL et du document "Conception BDD" dans ma signature, avant de continuer à t'enfoncer dans des problèmes que tu n'aurais pas eu en te formant un minimum ...

      On va juste faire ce que tu veux avec une seule requête :

      SELECT
      	P.code,
      	P.produit,
      	M.mesure,
      	SUM( quantite ) AS qte_totale
      FROM
      	commandes C
      		INNER JOIN recette R
      			ON C.recette = R.id
      		INNER JOIN ingredient I
      			ON R.id = I.id_recette
      		INNER JOIN rep_produits P
      			ON I.id_produit = P.code
      		INNER JOIN rep_mesure M
      			ON P.mesure = M.code
      WHERE C.date_menu BETWEEN ? AND ?
      GROUP BY
      	P.code,
      	P.produit,
      	M.mesure
      ORDER BY P.produit;

      Ce qui fait que ton code PHP devient seulement :

      $requete = $bdd->prepare('
      	SELECT
      		P.code,
      		P.produit,
      		M.mesure,
      		SUM( quantite ) AS qte_totale
      	FROM
      		commandes C
      			INNER JOIN recette R
      				ON C.recette = R.id
      			INNER JOIN ingredient I
      				ON R.id = I.id_recette
      			INNER JOIN rep_produits P
      				ON I.id_produit = P.code
      			INNER JOIN rep_mesure M
      				ON P.mesure = M.code
      	WHERE C.date_menu BETWEEN ? AND ?
      	GROUP BY
      		P.code,
      		P.produit,
      		M.mesure
      	ORDER BY P.produit;'
      );
      $requete->execute( array( $lun_comm, $dim_comm ) );
      $produits = $requete->fetchAll();
      $requete->closeCursor();
      
      foreach( $produits as $produit ) {
      	echo '<p>'.$produit['produit'].' : '.$produit['qte_totale'].' '.$produit['mesure'].'</p>';
      }
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        27 novembre 2020 à 14:36:22

        Vraiment super sympa tes précieux conseils benzouye 👍

        Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'quantite' in field list is ambiguous

        j'ai remplacé SUM( quantite ) AS qte_totale par SUM( I.quantite ) AS qte_totale pour indiquer tout simplement la table et... c'était ca ! lol

        par contre je n'arrive pas scinder dans la même requête , d'un coté le nom de recette et de l'autres ses ingredients.. comme l'image ci dessous. dois je à ce moment là faire une autre requête ?



        -
        Edité par gagg 28 novembre 2020 à 3:10:23

        • Partager sur Facebook
        • Partager sur Twitter

        résultat d'une 4ème table en partant de la 1ère

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown