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

SQL Procédural MySQL Discussion :

Procédure multistep avec IN clause


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Par défaut Procédure multistep avec IN clause
    Bonjour,
    pour certaine raisons jai besoin dexploser une requete en plusieurs, je sais quil est possible de faire select * IN(subquery) ou encore where exists(select), mais ce n'est pas ce que je veux faire, ni ce dont jai besoin svp.
    Comment construire une requete ou le resultat de la premiere est utilisé dans la clause IN de la deuxieme au sein d'une meme procédure ?
    Dans l'idéal ma requete2 ressemblerait à SELECT stuf where IN(id,id,id,longlistid,..)

    requete1 => select stuff as result1
    requete2 => select otrestuff where bob IN(result1).

    J'ai pensé utilisée les racourci mais.. voila mon essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE `exemple`()
    BEGIN
     
     SELECT @query1 := 
    `foo`  FROM `table`
    WHERE `stuf`= 'cat'
    UNION ALL SELECT `foo`
    FROM `table`
    WHERE `dog`= 'hard' ;
     
    SELECT please FROM help WHERE me IN(@query1) ;
     
    END
    update

    Et voici ma deuxieme direction , déclarer une variable locale pour insérer les premiers résultats
    et les utiliser dans la deuxieme, ce qui renvoie l'erreur logique :
    Error Code: 1172. Result consisted of more than one row

    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
    16
    CREATE PROCEDURE `exemple`()
        BEGIN
     
         DECLARE resultquery1 VARCHAR(5000);
     
        SELECT 
        `id`  FROM `table`
        WHERE `stuf`= 'cat'
        UNION ALL SELECT `id`
        FROM `table`
        WHERE `dog`= 'hard' 
        INTO resultquery1 ;
     
        SELECT please FROM help WHERE me IN(resultquery1) ;
     
        END

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut jess,

    si la première requête renvoie possiblement plus d'un résultat tu dois passer par une table temporaire que tu remplis avec celle-ci et que tu utilises comme tu veux dans la seconde (dans le from, en jointure ou autre...)


  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Par défaut
    ah non pas de table temporaire cest pas possible.., requete1 renvoie 500 id ,il semble que je doive faire cette requette en exterieur donc..
    Ca me parraissait jouable comme fonctionalité.. , genre la variable locale pourrait etre un array qu'ont peut donc peupler..

    Merci pour l'info jaurai galérée quelques heures qui m'ont surement apris des choses..

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    tu n'as pas les types array, record ou table pour les variables...

    d'où le passage par les tables temporaires comme intermédiaires dans ces cas là...

    ça marche très bien entre ou dans les procédures...

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Par défaut
    je vais regarder(encore) ca merci du conseil, dautre questions à venir prochainement , avec tt ce temps..ma requete est devennue franchement..complexe
    bonne soirée

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    tu es limitée par le nombre d'éléments seulement pour les tables temporaires avec le moteur memory

  7. #7
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Par défaut
    Dans mon cas les tables temporaires n'ont pas été concluantes , jai trouvé un autre moyen en utilisant GROUP_CONCAT
    qui permet de créer une liste pret a etre utiliser avec la clause IN , et comme cest ce que je cherchais ca tombe bien !
    Il y a peut etre plus propre mais dans mon cas ceci fonctionne comme je voulais :

    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
    16
    17
    18
    CREATE PROCEDURE `exemple`()
        BEGIN
     
        DECLARE temp VARCHAR(10000); 
        SET SESSION group_concat_max_len = 100000; 
     
        SELECT GROUP_CONCAT(a) FROM b
        WHERE cible = c  GROUP BY cible INTO temp; 
     
        SET @S = CONCAT
       (
        "SELECT * FROM otretable WHERE otrechose IN(", temp," ) "
       );
     
        PREPARE STMT FROM @S;
        EXECUTE STMT;   
     
        END

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2015, 13h05
  2. Procédure stockée avec variable en clause FROM
    Par Richard MORRISSEY dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/11/2006, 16h00
  3. Pb avec la clause ORDER BY...
    Par Karibou dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/08/2005, 14h48
  4. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05
  5. Procédure stockée avec param de sortie:marchepas av ADO
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/10/2004, 12h04

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