IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Variables utilisateurs et leur portée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut Variables utilisateurs et leur portée
    Bonjour,

    Dans une requête je crée une variable utilisateur que je réutilise dans la même requête à l'intérieur d'une table dérivée, mais visiblement celle-ci est nulle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT @test:=1
    UNION ALL 
     
    SELECT ligne FROM
    (SELECT CONCAT(CAST(@test as CHAR),'2') ligne ) T
    Résultat :

    1
    NULL
    Comment conserver la portée de la variable y compris lors de l'utilisation de tables dérivées ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Ceci fonctionne, mais nécessite deux lignes de commande... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SET @test=1;
    SELECT @test
    UNION ALL 
     
    SELECT ligne FROM
    (SELECT CONCAT(CAST(@test as CHAR),'2') ligne ) T
    résultat
    1
    12

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut xounet.

    Pourquoi faire aussi compliqué ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    --------------
    select  1 as val
    union select 12 as val
    union select 33 as val
    union select 72 as val
    --------------
     
    +-----+
    | val |
    +-----+
    |   1 |
    |  12 |
    |  33 |
    |  72 |
    +-----+
    @+

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Bonjour,

    En fait j'ai pas vraiment le choix je suis obligé d'utiliser une sous requête dans mon programme utilisant une variable utilisateur précédemment définie et du coup ce que tu proposes ne permet d'utiliser de variables.

    @test est une variable et pas une constante que je connais à l'avance, l'exemple SELECT @test:=1 n'est qu'une forme très simplifiée de la requête que j'utilise qui est plutôt du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET @test=(SELECT CONCAT_WS('|',champ....) FROM TABLE WHERE ...);
    UNION ALL 
    SELECT ligne FROM
    (SELECT CONCAT(CAST(@test as CHAR),'2') ligne ) T
    Merci quand même.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut xounet.

    A vrai dire, je ne comprends pas ce que tu cherches à faire.

    Pourrais-tu donner un exemple de ce que tu as avant et ce que tu désires obtenir après sous forme de tableau ?

    En général, le @test sert dans une requête, soit pour numéroter des lignes, ou récupérer le résultat d'une autre requête afin de l'introduire, sous forme de constante dans une autre requête.

    @+

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    La documentation recommande de ne pas utiliser de variable à la fois en lecture et en écriture au sein d'une requete...

    Cela n'est pas une question de portée de variable. Rien ne vous garantie que la requête sera exécutée dans l'ordre où elle est écrite.
    En occurrence, la deuxième sous requete peut être exécutée avant la première, ce qui pourrait expliquer ce comportement.

    vous pouvez essayer quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CONCAT(CAST(@test as CHAR),c) ligne 
    FROM    (SELECT CONCAT_WS('|',champ....) AS test FROM TABLE WHERE ...) T1
        ,     (
              SELECT '' as c
              UNION ALL SELECT '2'
        ) T2

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Bonjour aieeeuuuuu,

    Ce que tu proposes est intéressant et illustre bien ce que tu indiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CONCAT(test,c) ligne
    FROM    (SELECT 'a' as test UNION ALL SELECT 'b' ) T1
        ,     (
              SELECT '1' as c
              UNION ALL SELECT '2'
        ) T2
    ligne
    a1
    b1
    a2
    b2

    Mais cela ne permet pas par exemple de réutiliser c ou test dans la suite de la requête par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT CONCAT(test,c) ligne
    FROM    (SELECT 'a' as test UNION ALL SELECT 'b' ) T1
        ,     (
              SELECT '1' as c
              UNION ALL SELECT '2'
        ) T2
     
    UNION ALL 
    SELECT GROUP_CONCAT(test SEPARATOR '|')
    Ne marche pas et indique :

    #1054 - Unknown column 'test' in 'field list'
    Je crois qu'il n'y pas d'autres moyens à part utiliser la commande SET...

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    si, certainement avec une technique similaire.

    Mais là je ne vois vraiment pas où vous voulez en venir, en faisant un GROUP_CONCAT sur une seule ligne...

    Expliquez nous vos tables, et surtout le résultat final que vous voulez obtenir.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Mon problème est assez simple, j'ai une requête très longue qui enchaîne successivement plusieurs requêtes fusionnées avec UNION ALL. Certaines requêtes se répètent, pour cela j'ai choisi de les stocker dans une variable type "@mon_resultat_sql1". Cette variable doit pouvoir être utilisée par la suite même après succession importante de UNION ALL et de sous requêtes.
    Sur le principe ce que j'essaie de faire c'est la même chose que ces requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT CONCAT(test,c) ligne
    FROM    (SELECT 'a' as test UNION ALL SELECT 'b' ) T1
        ,     (
              SELECT '1' as c
              UNION ALL SELECT '2'
        ) T2
     
    UNION ALL 
    SELECT GROUP_CONCAT(test SEPARATOR '|')
    ou bien ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT @test:=1
    UNION ALL 
     
    SELECT ligne FROM
    (SELECT CONCAT(CAST(@test as CHAR),'2') ligne ) T
    La solution que j'ai pour l'instant c'est d'utiliser plusieurs lignes de commandes avec des "SET @variable=..." ce qui ne m'arrange pas j'aurai préféré utiliser successivement des commandes "SELECT @mavariable:=... " dans une seule requête. Je ne vois pas d'autre solution.

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut xounet.

    Citation Envoyé par xounet
    Mon problème est assez simple
    Pas tant que cela, car on arrive au post #10, sans avoir compris la problématique de ton problème.

    Afin de bien répondre (ou faire une tentative), il nous faut :

    1) quelques explications sur la difficulté que tu rencontres.

    2) le DDL de tes toutes les tables entrant dans ta requête posant problème.

    3) d'un jeu d'essai complet incluant le problème que tu rencontre.
    J'insiste sur "complet", car si un cas de figure manque, la requête peut être fausse.

    4) le résultat que tu désires obtenir.

    @+

Discussions similaires

  1. Variable utilisateurs SQL
    Par Chtulus dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/04/2008, 09h05
  2. [xml] variable utilisateur en cours
    Par arthrax dans le forum Windows XP
    Réponses: 1
    Dernier message: 27/03/2007, 13h40
  3. Réponses: 4
    Dernier message: 23/02/2007, 09h37
  4. Réponses: 5
    Dernier message: 17/08/2006, 10h10
  5. Réponses: 2
    Dernier message: 25/04/2006, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo