Partage
  • Partager sur Facebook
  • Partager sur Twitter

Select avec variable ne fonctionne pas mysql

Sujet résolu
    9 novembre 2017 à 9:39:37

    Bonjour, j'ai un problème que je ne comprend absolument.

    J'essaye de récupérer une valeur float dans une table qui s'appelle Indice.

    Ma requête :

    SELECT valeur_2017 FROM indice where service like 'Monitoring';

    renvoie :
    +-------------+
    | valeur_2017 |
    +-------------+
    |     1.09445 |
    +-------------+

    C'est le résultat attendu.

    Sauf que j'utilise cette requête dans une procédure et que valeur_2017 peut être valeur_2018, valeur_2019 etc..

    Dès que je fais la requête précédente mais avec une variable à la place de valeur_2017, la requête me renverra 'valeur_2017' et non la valeur float.

    Par exemple :

    SELECT 'valeur_2017' INTO @test;
    
    SELECT @test from indice where service like 'Monitoring'

    Renverra :

    +-------------+
    | @test      |
    +-------------+
    | valeur_2017 |
    +-------------+

    J'ai mis beaucoup de temps à identifier le problème, à la base il est dans une procédure, j'ai essayé de déclarer une variable local plutôt que de session mais ca ne change rien.

    J'utilise mysql.

    Merci de votre aide !

    EDIT :

    Apparemment on ne peut pas faire de requête avec une variable (https://dev.mysql.com/doc/refman/5.7/en/user-variables.html) j'ai résolu le problème comme ca :

    set @req = CONCAT("SELECT ", v_annee_indice ," FROM indice where service_indice like 'Monitoring 24*7'");
    
    prepare stmt from @req;
    			
    EXECUTE stmt;



    -
    Edité par Xaaav67 9 novembre 2017 à 10:04:43

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2017 à 17:36:46

      Bonjour,

      Xaaav67 a écrit:

      Apparemment on ne peut pas faire de requête avec une variable

      Si mais cela s'appelle une requête préparée, ce que tu as fais avec PREPARE ;)

      Xaaav67 a écrit:

      valeur_2017 peut être valeur_2018, valeur_2019

      C'est une erreur de conception de la base de données ... lorsque tu commences à numéroter tes colonnes c'est que tu as oublié une relation dans ton modèle ...

      Tu aurais du avoir un modèle en deux tables :

      • service ( id_service [pk], indice, etc. ) pour stocker tes services
      • valeur ( id_valeur [pk], id_service [fk], annee, valeur ) pour stocker une valeur par année et par service
      • 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 novembre 2017 à 21:13:59

        Merci de ta réponse !

        Je dois avouer que la conception de ma base de donnée est loin d'être parfaite mais séparer ma table en 2 ne semble pas être efficace. Je n'ai que des valeurs pour les années 2016,2017,2018,2019 et utiliser 2 tables m'oblige à faire des jointures supplémentaires.

        Par contre j'aurais bien aimé savoir pourquoi le fait de faire une requête avec une variable sans préparer la requête est impossible...

        EDIT :

        Au final avec un peu de recul je me rend compte qu'en effet ma table indice est mal conçue. Je l'ai réorganisé (à ma manière) et je n'ai plus besoin de requêtes préparés.

        Merci de ton aide :)

        -
        Edité par Xaaav67 10 novembre 2017 à 14:55:54

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2017 à 17:14:43

          Xaaav67 a écrit:

          j'aurais bien aimé savoir pourquoi le fait de faire une requête avec une variable sans préparer la requête est impossible

          Parce que par définition, une requête dont des éléments sont des variables est une requête préparée :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

          Select avec variable ne fonctionne pas mysql

          × 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