Partage
  • Partager sur Facebook
  • Partager sur Twitter

requete complexe en SQL

requete complexe en SQL

    9 mai 2019 à 17:01:08

    Bonjour tout le monde,

    En ce moment, j'essaie de faire une requête qui récapitulerait tout mais cependant je n'arrive pas à écrire  cette reqûete malgré que j'ai le résultat que je voudrais obtenir.  

    Je vous explique tout : 

    Je possede 3 tables :

    une table lot ( idLot,prixLot,date,objetLot......)

    une table option(idOption,idLot#,prixOption,ACC)

    une table variante(idVariante,idLot#,prixVariante,ACC)

    Parfois on a plusieurs lots (souvent même)

    et du coup admettons on a 2 lots avec 2 objetLots differents et 2 prix differents  et dans ces 2 lots on a pas d'option et on a pas de variante alors  j'aurais un tableau qui,grâce à une requete me montrerait mes 2 lots avec les differentes informations sur ces 2 lots.

    Mais le problème commence ici,

    Je voudrais faire un grand tableau récapitulatif où je verrai chaque lot avec une nouvelle colonne que j'ai nommé total .

    Et dans total, j'aurais donc le total du lot. Donc si le lot n'a pas d'option et de variante alors le total du lot est égal au prix du lot. Rien de compliqué.

    Mais si maintenant dans le lot 1 j'ai 5 option avec ACC= oui pour les 5  ( ACC sert a dire si l'option est accepté ou si elle est refusée) alors dans le total, je devrais avoir le prix du lot 1 + le prix des 5 options.  Je pense avoir réussi a faire ceci.   

    Et si maintenant dans le lot 1 on me dit qu'il y a 1 variante qui est accepté alors je devrais avoir dans le total le prix de cette variante ( et non plus le prix du lot)  + le prix des options 

    Et si dans le lot 1 il n'y a pas d'options mais juste une variante alors le total est égal au prix de la variante 

    Voilà donc je sais pas trop si quelqu'un va prendre du temps pour répondre à ceci mais j'avais besoin de demander car je suis complètement bloqué.

    Merci  de votre aide si vous pouvez !!! 

    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2019 à 17:45:18

      Bonjour,

      Peut-il y avoir plusieurs variantes acceptées pour un même lot ?

      Si c'est sûr que non, tu peux simplement faire :

      SELECT
          L.idLot,
          COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
          SUM( O.prixOption ) AS totalOptions
      FROM
          lot L
              LEFT JOIN variante V
                  ON L.idLot = V.idLot
                  AND V.ACC = 1
              LEFT JOIN option O
                  ON L.idLot = O.idLot
                  AND O.ACC = 1
      GROUP BY
          L.idLot,
          L.prixLot,
          V.prixVariante

      Si il peut y avoir plusieurs variantes acceptées pour un même lot ... C'est plus délicat ...

      -
      Edité par Benzouye 9 mai 2019 à 17:45:58

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        9 mai 2019 à 19:02:03

        @Benyouze 

        Merci beaucoup de ta réponse.

        Pour ce qui est de ta question, je pense que oui c'est possible mais extrêment rare, je vais donc faire comme si c'était pas possible, en esperant que cela ne dérange pas mon tuteur.

        J'ai donc fais comme ceci : 

         "SELECT
            L.idLot,
            COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
            SUM( O.prixOption ) AS totalOptions
        FROM
            lot L
                LEFT JOIN variante V
                    ON L.idLot = V.idLot
                    AND V.ACC = 'OUI'
                LEFT JOIN option O
                    ON L.idLot = O.idLot
                    AND O.ACC = 'OUI'
        GROUP BY
            L.idLot,
            L.prixLot,
            V.prixVariante";

        Mais à chaque fois j'obtiens fatal error :/

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2019 à 23:28:45

          Quelle erreur exactement ?
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 mai 2019 à 0:33:57

            En gros il me dis ceci : 

            <?php
            
            
            include("connection.php");
            $mc="";
            if(isset($_POST['rechercher'])){
            		$mc=$_POST['rechercher'];
            }
            //$req="select * from client where nom like '%mc'";
            //$rs=mysqli_query($req) or die(mysqli_error());
            
            $queryPeopleAndNote = "SELECT
                L.idLot,
                COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
                SUM( O.prixOption ) AS totalOptions
            FROM
                lot L
                    LEFT JOIN variante V
                        ON L.idLot = V.idLot
                        AND V.ACC = 1
                    LEFT JOIN option O
                        ON L.idLot = O.idLot
                        AND O.ACC = 1
            GROUP BY
                L.idLot,
                L.prixLot,
                V.prixVariante
              
              
              ;";
            		
            	$responsePeople = $db->query($queryPeopleAndNote);
            	$responsePeople->setFetchMode(PDO::FETCH_ASSOC );
            	
            	
            	//On boucle sur toutes les lignes récupérées
            	foreach ($responsePeople as $row) {
            		//On crée un tableau qui contiendra toutes nos personnes
            		$persons[] = $row;
            	}
            	$responsePeople->closeCursor();
            ?>

            merci

            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2019 à 8:49:49

              On ne voit pas l'erreur exacte sur ta copie d'écran...
              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                10 mai 2019 à 10:15:40

                ahh mince j'envoie une capture : 

                <?php
                SESSION_START();
                
                
                
                include("connection.php");
                
                
                	$queryPeopleAndNote = "SELECT
                    L.idLot,
                    COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
                    SUM( O.prixOption ) AS totalOptions
                FROM
                    lot L
                        LEFT JOIN variante V
                            ON L.idLot = V.idLot
                            AND V.ACC = 'OUI'
                        LEFT JOIN option O
                            ON L.idLot = O.idLot
                            AND O.ACC = 'OUI'
                GROUP BY
                    L.idLot,
                    O.prixLot,
                    V.prixVariante;";
                	$responsePeople = $db->query($queryPeopleAndNote);
                	$responsePeople->setFetchMode(PDO::FETCH_ASSOC );
                	
                	
                	//On boucle sur toutes les lignes récupérées
                	foreach ($responsePeople as $row) {
                		//On crée un tableau qui contiendra toutes nos personnes
                		$persons[] = $row;
                	}
                	$responsePeople->closeCursor();
                	$prixO='prixO';
                	$prix='prix';
                
                ?>



                • Partager sur Facebook
                • Partager sur Twitter
                  10 mai 2019 à 11:05:22

                  Tu postes la même chose ... Il n'y a pas l'erreur exacte affichée sur ta copie d'écran ...

                  Tu devrais normalement avoir affiché un message détaillé d'erreur "(1054): Unknown column 'O.prixLot' in 'group statement'"

                  Sinon, tu as modifié la clause GROUP BY de ma requête en changeant l'alias devant la colonne prixLot ... cette colonne est dans la table lot, pas option ... c'est donc L.prixLot, au lieu de O.prixLot ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    10 mai 2019 à 11:28:31

                    Oui mais j'ai déjà essayé en faisant un copié collé de votre requête mais il me dit juste  fatal error on line 25 et c'est tout .

                    Du coup j'a iessayé de me renseigné sur ce qui allait pas mais j'obtiens toujours fatal error 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 mai 2019 à 11:34:00

                      Lance la requête directement dans PHPMyAdmin (ou autre interface MySQL) et dis nous quelle erreur est retournée.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        13 mai 2019 à 15:25:33

                        Benzouye

                        Bonjour je reviens sur ce problème aujourd'hui que je n'ai toujours pas résolu.

                        Voilà le message d'erreur sur mysql  et vraiment je suis désolé de pas avoir compris plus tôt ^^

                        Edit:  C'est bon j'ai  trouvé d'où venait l'erreur . Il ne fallait pas mettre 2 where mais un seul where et il y avait aussi un champ que je n'avais rennomé.

                        Le problème avec cette requête c'est qu'elle m'affiche seulement si un marché possède au moins 1 option et 1 variante sur le même lot, ce qui est problématique, car il y a beaucoup de marché ne possédant pas d'options et/ou variante 

                        Il suffit que j'enlève le where mais j'obtiens ceci : 

                        Voilà merci de m'avoir lu ! et encore merci pour votre aide

                        -
                        Edité par zetyk"ret 13 mai 2019 à 16:04:47

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 mai 2019 à 16:51:09

                          zetyk"ret a écrit:

                          j'ai  trouvé d'où venait l'erreur . Il ne fallait pas mettre 2 where

                          Ce qui prouve bien que tu ne postais pas la requête complète ... Difficile de t'aider dans ce cas ...

                          zetyk"ret a écrit:

                          Il suffit que j'enlève le where mais j'obtiens ceci

                          Si tu utilises des jointures externes pour rendre la jointure "facultative", alors tu ne peux pas utiliser de colonnes de ces tables dans ta clause WHERE ... sinon cela annule l'effet "facultatif" de la table puisque tu imposes une condition dessus ...

                          Il faut soit combiner un OR ... IS NULL dans ta clause WHERE, soit mettre les conditions dans ta jointure.

                          Exemple avec le IS NULL :

                          SELECT
                              L.idLot,
                              COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
                              SUM( O.prixOption ) AS totalOptions
                          FROM
                              lot L
                                  LEFT JOIN variante V
                                      ON L.idLot = V.idLot
                                      AND V.ACC = 'OUI'
                                  LEFT JOIN option O
                                      ON L.idLot = O.idLot
                                      AND O.ACC = 'OUI'
                          WHERE
                              (
                                  V.prixVariante > 100
                                  OR V.idVariante IS NULL
                              ) AND (
                                  O.prixOption > 100
                                  OR V.idOption IS NULL
                              )
                          GROUP BY
                              L.idLot,
                              L.prixLot,
                              V.prixVariante

                          Exemple par la jointure :

                          SELECT
                              L.idLot,
                              COALESCE( V.prixVariante, L.prixLot ) AS totalLot,
                              SUM( O.prixOption ) AS totalOptions
                          FROM
                              lot L
                                  LEFT JOIN variante V
                                      ON L.idLot = V.idLot
                                      AND V.ACC = 'OUI'
                                      AND V.prixVariante > 100
                                  LEFT JOIN option O
                                      ON L.idLot = O.idLot
                                      AND O.ACC = 'OUI'
                                      AND O.prixOption > 100
                          GROUP BY
                              L.idLot,
                              L.prixLot,
                              V.prixVariante
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            14 mai 2019 à 16:45:13

                            Benzouye

                            Je tenais à vous remercier pour ce que vous avez fait pour moi car grâce à vous, j'ai réussi à terminer mes requêtes et j'ai pu commencer à réaliser mes exports CSV

                            Merci beaucoup !!!!!!

                            • Partager sur Facebook
                            • Partager sur Twitter

                            requete complexe en SQL

                            × 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