Partage
  • Partager sur Facebook
  • Partager sur Twitter

MYSQL Syntaxe

PROCEDURES STOCKEES ET VARIABLES

Anonyme
    16 septembre 2017 à 14:30:17

    Bonjour.

    J'ai de grosse difficultés avec la syntaxe mysql.

    Ce script :

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `2017resultats`
    --
    --
    -- Structure de la table `2017resultats`
    --
    DROP TABLE IF EXISTS `2017resultats`;
    CREATE TABLE `2017resultats` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sport` Varchar(10) NOT NULL DEFAULT '0',
      `mois` int(2) NOT NULL DEFAULT 0,
      `somme` int(6) NOT NULL DEFAULT 0,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    --
    -- Contenu de la table `2017resultats`
    --
    
    -- SET @annee = 2017;
     
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `2017resultats`
    --
    --
    -- Structure de la table `2017resultats`
    --
    DROP TABLE IF EXISTS `2017resultats`;
    CREATE TABLE `2017resultats` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sport` Varchar(10) NOT NULL DEFAULT '0',
      `mois` int(2) NOT NULL DEFAULT '0',
      `somme` int(6) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    --
    -- Contenu de la table `2017resultats`
    --
     
    
     
    DROP PROCEDURE IF EXISTS `sommes_mensuelles`; 
    
    DELIMITER | 
    CREATE PROCEDURE sommes_mensuelles ()
    
    DETERMINISTIC
    LANGUAGE SQL
    
            BEGIN
    DECLARE _nbmois INT DEFAULT 12;
    DECLARE _an INT DEFAULT 2017;
    DECLARE _mois INT DEFAULT 0;
    DECLARE _sport VARCHAR(3) DEFAULT 'V';
    DECLARE _somme INT DEFAULT 0;
    
    
    
                 WHILE _mois <= _nbmois DO
    
                     SET _mois = _mois + 1;
    
                     -- query
                     SELECT SUM(distance_parcours) AS sum INTO _somme FROM parcours as p
    					INNER JOIN sorties AS s
    					ON p.id_parcours = s.parcours_id_parcours
    					WHERE YEAR(s.date_sorties) = _an 
    					AND MONTH(s.date_sorties) = _mois
    					AND p.sport_parcours = _sport;
    
                     INSERT INTO `2017resultats` (`sport`, `mois`, `somme`)
                     VALUES (_sport, _mois, _somme);
    
                 END WHILE;
    
                 SET _mois = 1;
             END;
    
    
    
    
     
    
         |
    DELIMITER ;
    
     
     
    CALL sommes_mensuelles ();
     
    
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
     
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    
    /* CA MARCHE
    SET @somme = 0;
    SELECT SUM(distance_parcours) AS sum INTO @somme FROM parcours as p
    INNER JOIN sorties AS s
    ON p.id_parcours = s.parcours_id_parcours
    WHERE YEAR(s.date_sorties) = 2017
    AND MONTH(s.date_sorties) = 5
    AND p.sport_parcours = 'V';
    SELECT @somme; */
     
     


    me renvoie :

    Erreur dans la requête (1048): Column 'somme' cannot be null 

    Alors que :

    SET @somme = 0;
    SELECT SUM(distance_parcours) AS sum INTO @somme FROM parcours as p
    INNER JOIN sorties AS s
    ON p.id_parcours = s.parcours_id_parcours
    WHERE YEAR(s.date_sorties) = 2017
    AND MONTH(s.date_sorties) = 5
    AND p.sport_parcours = 'V';
    SELECT @somme;

    renvoie :

    @somme
    147

    J'y perds mon latin.

    Je trouve le langage mysql très tatillon et je de grosses difficultés à débugger.

    Merci de votre aide.



    -
    Edité par Anonyme 16 septembre 2017 à 14:31:08

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2017 à 14:58:10

      Bonjour,

      Si ta somme retourne quelque chose pour le mois 5 / 2017, cela ne signifie pas qu'elle retourne quelque chose pour les mois 1, 2, 3, 4 ...

      Il doit y avoir un de ces mois pour lequel ta requête ne retourne rien (NULL), et c'est cela qui t'est signifié par l'erreur ...

      83Alain a écrit:

      Je trouve le langage mysql très tatillon et je de grosses difficultés à débugger.

      Selon moi, rien à voir avec avec le langage, simplement avec tes valeurs dans la table parcours ...

      Après tu peux aussi remplacer NULL par 0 dans ta requête avec un COALESCE pour éviter cette erreur ...

      SELECT COALESCE( SUM(distance_parcours), 0 ) AS sum INTO @somme
      FROM
      	parcours as p
      		INNER JOIN sorties AS s
      			ON p.id_parcours = s.parcours_id_parcours
      WHERE
      	YEAR(s.date_sorties) = 2017
      	AND MONTH(s.date_sorties) = 5
      	AND p.sport_parcours = 'V';

      Ou carrément éviter la procédure avec une simple requête :

      INSERT INTO 2017_resultats ( sport, mois, somme )
      	SELECT
      		p.sport_parcours,
      		MONTH( s.date_sorties ),
      		SUM( distance_parcours ) AS distance
      	FROM
      		parcours as p
      			INNER JOIN sorties AS s
      				ON p.id_parcours = s.parcours_id_parcours
      	WHERE YEAR( s.date_sorties ) = 2017
      	GROUP BY
      		p.sport_parcours,
      		MONTH( s.date_sorties );

      Mais au final, je trouve que stocker ces valeurs consolidées est un peu lourd, surtout si tu as peu de valeurs dans la table sorties (moins de 10 000) et que ton application n'est pas fortement sollicitée (plusieurs consultations par minutes) ... Tu pourrais très bien faire les calculs au besoin avec un simple SELECT, plutôt que de les stocker dans une table ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
      Anonyme
        16 septembre 2017 à 15:29:45

        Merci beaucoup.

        Un soucis avec ma boucle FOR EACH que j'ai mal du comprendre :

        /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
        /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
        /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
        /*!40101 SET NAMES utf8 */;
         
        -- --------------------------------------------------------
         
        --
        -- Structure de la table `2017resultats`
        -- CA MARCHE
        --
        -- Structure de la table `2017resultats`
        --
        DROP TABLE IF EXISTS `2017resultats`;
        CREATE TABLE `2017resultats` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `sport` Varchar(10) NOT NULL DEFAULT '0',
          `mois` int(2) NOT NULL DEFAULT 0,
          `somme` int(6) NOT NULL DEFAULT 0,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
         
        --
        -- Contenu de la table `2017resultats`
        --
        
        SET @annee = 2017;
         
        
        /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
        /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
        /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
        /*!40101 SET NAMES utf8 */;
         
        -- --------------------------------------------------------
         
        --
        -- Structure de la table `2017resultats`
        --
        --
        -- Structure de la table `2017resultats`
        --
        DROP TABLE IF EXISTS `2017resultats`;
        CREATE TABLE `2017resultats` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `sport` Varchar(10) NOT NULL DEFAULT '0',
          `mois` int(2) NOT NULL DEFAULT '0',
          `somme` int(6) NOT NULL DEFAULT '0',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
         
        --
        -- Contenu de la table `2017resultats`
        --
         
        
         
        DROP PROCEDURE IF EXISTS `sommes_mensuelles`; 
        
        DELIMITER | 
        CREATE PROCEDURE sommes_mensuelles (IN _an INT)
        
        DETERMINISTIC
        LANGUAGE SQL
        
        BEGIN
        DECLARE _nbmois INT DEFAULT 12;
        DECLARE _mois INT DEFAULT 0;
        DECLARE _sport VARCHAR(3);
        DECLARE _somme INT DEFAULT 0;
        
        
        	FOR EACH _sport IN ( 'V', 'C', 'N' ) 
        		BEGIN	
        			 WHILE _mois <= _nbmois DO
        
        				 SET _mois = _mois + 1;
        
        				 -- query
        				 SELECT COALESCE( SUM(distance_parcours), 0 ) AS sum INTO _somme
        					FROM parcours as p
        							INNER JOIN sorties AS s
        								ON p.id_parcours = s.parcours_id_parcours
        					WHERE
        						YEAR(s.date_sorties) = _an
        						AND MONTH(s.date_sorties) = _mois
        						AND p.sport_parcours = _sport;
        						
        
        				 INSERT INTO `2017resultats` (`sport`, `mois`, `somme`)
        				 VALUES (_sport, _mois, _somme);
        
        			 END WHILE;
        
        			 SET _mois = 1;
        		END;
        	END FOREACH;
        END; 
        
        
        
         
        
             |
        DELIMITER ;
        
         
         
        CALL sommes_mensuelles (@annee);
         
        
         
        /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
        /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
        /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
         
         
        /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
        /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
        /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
        
        /* CA MARCHE
        SET @somme = 0;
        SELECT SUM(distance_parcours) AS sum INTO @somme FROM parcours as p
        INNER JOIN sorties AS s
        ON p.id_parcours = s.parcours_id_parcours
        WHERE YEAR(s.date_sorties) = 2017
        AND MONTH(s.date_sorties) = 5
        AND p.sport_parcours = 'V';
        SELECT @somme; */
         
         

        qui donne :

        Erreur dans la requête (1064): Syntax error near 'FOR EACH _sport IN ( 'V', 'C', 'N' ) BEGIN WHILE _mois <= _nbmois DO ' at line 13 

        Je vous remercie d'avance de votre aide.


        -
        Edité par Anonyme 16 septembre 2017 à 17:54:00

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 septembre 2017 à 20:30:37

          Bonjour.

          Pour résoudre le problème ci-dessus, est ce que le la boucle FOR EACH existe en MySQL.

          Plus précisément, j'ai MySQL 5.6.15.

          Merci de votre aide.

          Finalement, j'ai trouvé cette solution mais je bloque un peu plus loin :

          /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
          /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
          /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
          /*!40101 SET NAMES utf8 */;
           
          -- --------------------------------------------------------
           
          --
          -- Structure de la table `2017resultats`
          -- CA MARCHE
          --
          -- Structure de la table `2017resultats`
          --
          DROP TABLE IF EXISTS `2017resultats`;
          CREATE TABLE `2017resultats` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `sport` Varchar(10) NOT NULL DEFAULT '0',
            `mois` int(2) NOT NULL DEFAULT 0,
            `somme` int(6) NOT NULL DEFAULT 0,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
           
          --
          -- Contenu de la table `2017resultats`
          --
          
          SET @annee = 2017;
           
          
          /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
          /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
          /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
          /*!40101 SET NAMES utf8 */;
           
          -- --------------------------------------------------------
           
          --
          -- Structure de la table `2017resultats`
          --
          --
          -- Structure de la table `2017resultats`
          --
          DROP TABLE IF EXISTS `2017resultats`;
          CREATE TABLE `2017resultats` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `sport` Varchar(10) NOT NULL DEFAULT '0',
            `mois` int(2) NOT NULL DEFAULT '0',
            `somme` int(6) NOT NULL DEFAULT '0',
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
           
          --
          -- Contenu de la table `2017resultats`
          --
           
          
           
          DROP PROCEDURE IF EXISTS `sommes_mensuelles`; 
          
          DELIMITER | 
          CREATE PROCEDURE sommes_mensuelles (IN _an INT)
          
          DETERMINISTIC
          LANGUAGE SQL
          
          BEGIN
          DECLARE _nbmois INT DEFAULT 12;
          DECLARE _mois INT DEFAULT 0;
          DECLARE _sport VARCHAR(3);
          DECLARE _nsport INT DEFAULT 0;
          DECLARE _tsport INT DEFAULT 3;
          DECLARE _somme INT DEFAULT 0;
          
          	WHILE _nsport <= _tsport DO
          
          	SET _nsport = _nsport + 1;
          	-- IF(condition, operation_si_vrai, operation_si_faux);
          	/* SELECT IF(_nsport = 1, _sport = 'V', 
          			SELECT IF(_nsport = 2, _sport = 'C',  _sport = 'N')
          		) */
          		
          	IF _nsport = 1 THEN
          		SET _sport = 'V';
          
          	ELSEIF _nsport = 2 THEN
          		SET _sport = 'C';
          
          	ELSE
          		SET _sport = 'N';
          
          	END IF;
          		
          
          		BEGIN	
          			 WHILE _mois <= _nbmois DO
          
          				 SET _mois = _mois + 1;
          
          				 -- query
          				 SELECT COALESCE( SUM(distance_parcours), 0 ) AS sum INTO _somme
          					FROM parcours as p
          							INNER JOIN sorties AS s
          								ON p.id_parcours = s.parcours_id_parcours
          					WHERE
          						YEAR(s.date_sorties) = _an
          						AND MONTH(s.date_sorties) = _mois
          						AND p.sport_parcours = _sport;
          						
          
          				 INSERT INTO `2017resultats` (`sport`, `mois`, `somme`)
          				 VALUES (_sport, _mois, _somme);
          
          			 END WHILE;
          
          			 SET _mois = 1;
          		END;
          	END WHILE;
          
          END; 
          
          
          
           
          
               |
          DELIMITER ;
          
           
           
          CALL sommes_mensuelles (@annee);
           
          
           
          /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
          /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
          /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
           
           
          /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
          /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
          /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
          
          /* CA MARCHE
          SET @somme = 0;
          SELECT SUM(distance_parcours) AS sum INTO @somme FROM parcours as p
          INNER JOIN sorties AS s
          ON p.id_parcours = s.parcours_id_parcours
          WHERE YEAR(s.date_sorties) = 2017
          AND MONTH(s.date_sorties) = 5
          AND p.sport_parcours = 'V';
          SELECT @somme; */
           
           


          Le code ci-dessous ne fonctionne pas :

          SET @annee = 2017;
          SET @tableresultats = CONCAT('''', @annee, 'resultats', '''');
          
          DROP TABLE IF EXISTS @tableresultats ;



          -
          Edité par Anonyme 17 septembre 2017 à 22:25:21

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2017 à 9:08:30

            ça fait plaisir de se sentir lu ...

            As-tu regardé ma dernière requête ? Pas besoin de boucle ou de procédure, un simple INSERT :

            INSERT INTO 2017_resultats ( sport, mois, somme )
                SELECT
                    p.sport_parcours,
                    MONTH( s.date_sorties ),
                    SUM( distance_parcours ) AS distance
                FROM
                    parcours as p
                        INNER JOIN sorties AS s
                            ON p.id_parcours = s.parcours_id_parcours
                WHERE YEAR( s.date_sorties ) = 2017
                GROUP BY
                    p.sport_parcours,
                    MONTH( s.date_sorties );
            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            Anonyme
              18 septembre 2017 à 9:31:31

              Bonjour.

              J'ai bien lu ta requête qui fonctionne et je t'en remercie.

              Je veux juste pratiquer un peu mysql et j'ai de gros soucis avec la syntaxe.

              • Partager sur Facebook
              • Partager sur Twitter
                18 septembre 2017 à 9:45:47

                83Alain a écrit:

                Le code ci-dessous ne fonctionne pas :

                SET @annee = 2017;
                SET @tableresultats = CONCAT('''', @annee, 'resultats', '''');
                
                DROP TABLE IF EXISTS @tableresultats ;

                Les 4 apostrophes à la suite ... ce n'est pas bon ...

                Qu'essayes-tu de faire ? Créer une table par année ?

                Tu ne peux pas utiliser de variable de cette manière dans une requête, ou alors il faut passer par des requêtes préparées.

                Après je réitère ma remarque précédente :

                Benzouye a écrit:

                je trouve que stocker ces valeurs consolidées est un peu lourd, surtout si tu as peu de valeurs dans la table sorties (moins de 10 000) et que ton application n'est pas fortement sollicitée (plusieurs consultations par minutes) ... Tu pourrais très bien faire les calculs au besoin avec un simple SELECT, plutôt que de les stocker dans une table ...

                83Alain a écrit:

                Je veux juste pratiquer un peu mysql

                Ok pour la pratique, mais la création de tables avec des variables n'est pas une bonne pratique. Une seule table résultats avec une colonne année en plus, serait, au pire, suffisante ...
                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                Anonyme
                  18 septembre 2017 à 13:34:06

                  Merci

                  Benzouye a écrit:

                  Tu ne peux pas utiliser de variable de cette manière dans une requête, ou alors il faut passer par des requêtes préparées.


                  C'est ce que je voulais savoir.

                  Je vais maintenant avancer avec tous ce que tu m'as donné.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 septembre 2017 à 21:05:56

                    Bonjour.

                    Avec votre aide, j'ai réussi à faire ce que je voulais.

                    Certaines choses ne sont pas possible en dehors d'une procédure stockée.

                    Ce code répond à les attentes :

                    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
                    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
                    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
                    /*!40101 SET NAMES utf8 */;
                     
                    -- --------------------------------------------------------
                     
                     -- Pour test debut
                    SET @annee = 2017;
                    -- Pour test fin
                    
                    -- --------------------------------------------------------
                    -- CA MARCHE
                    -- -------------------------------------------------------
                    
                    DROP PROCEDURE IF EXISTS `sommes_mensuelles`;
                    
                    DELIMITER | 
                    CREATE PROCEDURE sommes_mensuelles (IN _an INT)
                    DETERMINISTIC
                    LANGUAGE SQL
                    
                    BEGIN
                    DECLARE _tableresultats VARCHAR(13);
                    SET _tableresultats = concat(_an, 'resultats');
                    
                    END;
                    
                    BEGIN
                    --
                    -- Structure de la table `2017resultats`
                    --
                    DROP TABLE IF EXISTS _tableresultats ;
                    CREATE TABLE _tableresultats (
                      `id` int(11) NOT NULL AUTO_INCREMENT,
                      `sport` Varchar(10) NOT NULL DEFAULT '0',
                      `mois` int(2) NOT NULL DEFAULT '0',
                      `somme` int(6) NOT NULL DEFAULT '0',
                      PRIMARY KEY (`id`)
                    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
                    
                    END; 
                    
                    
                    BEGIN
                    --
                    -- Contenu de la table `2017resultats`
                    --
                    DECLARE _nbmois INT DEFAULT 12;
                    DECLARE _mois INT DEFAULT 1;
                    DECLARE _sport VARCHAR(3);
                    DECLARE _nsport INT DEFAULT 0;
                    DECLARE _tsport INT DEFAULT 3;
                    DECLARE _somme INT DEFAULT 0;
                    DECLARE _total INT DEFAULT 0;
                    
                    	WHILE _nsport < _tsport DO
                    
                    	SET _nsport = _nsport + 1;
                    	-- IF(condition, operation_si_vrai, operation_si_faux);
                    	SELECT IF(_nsport = 1, _sport = 'V', 
                    			SELECT IF(_nsport = 2, _sport = 'C',  _sport = 'N')
                    		) 
                    		
                    	IF _nsport = 1 THEN
                    		SET _sport = 'V';
                    
                    	ELSEIF _nsport = 2 THEN
                    		SET _sport = 'C';
                    
                    	ELSEIF _nsport = 3 THEN
                    		SET _sport = 'N';
                    
                    	END IF;
                    		
                    
                    		BEGIN	
                    			WHILE _mois <= _nbmois DO
                    
                    				 -- query
                    				 SELECT COALESCE( SUM(distance_parcours), 0 ) AS sum INTO _somme
                    					FROM parcours as p
                    							INNER JOIN sorties AS s
                    								ON p.id_parcours = s.parcours_id_parcours
                    					WHERE
                    						YEAR(s.date_sorties) = _an
                    						AND MONTH(s.date_sorties) = _mois
                    						AND p.sport_parcours = _sport;
                    						
                    
                    				 INSERT INTO _tableresultats (`sport`, `mois`, `somme`)
                    				 VALUES (_sport, _mois, _somme);
                    			
                    			SET _mois = _mois + 1;
                    			END WHILE;
                    			
                    			SELECT COALESCE( SUM(somme), 0 ) AS sum INTO _total
                    			FROM _tableresultats
                    			WHERE sport = _sport;
                    			
                    			
                    			INSERT INTO _tableresultats (`sport`, `mois`, `somme`)
                    			VALUES (_sport, 13, _total);
                    			
                    			SET _mois = 1;
                    		END;
                    	END WHILE;
                    
                    END; 
                    
                         |
                    DELIMITER ;
                    
                    -- Pour test debut
                    CALL sommes_mensuelles (@annee);
                    -- Pour test fin
                     
                    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
                    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
                    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
                     
                    



                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 septembre 2017 à 8:48:50

                      Ne manque-t-il pas une colonne année dans ta table résultats ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      Anonyme
                        26 septembre 2017 à 9:54:31

                        Bonjour.

                        Ben non il ne manque pas de colonne, cet exercice était basé sur une table par année.

                        En tous cas, merci de ton aide.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        MYSQL Syntaxe

                        × 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