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 :

SELECT sur une table résultat d'un autre SELECT


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut SELECT sur une table résultat d'un autre SELECT
    Bonjour,

    Je cherche à faire un truc, sans doute un peu bizarre, mais qui pourrait m'être utile. Cependant, je ne sais pas si MySql l'autorise...

    En gros je veux faire un SELECT sur une table dont le nom est stockée dans une autre table. Intuitivement j'aurais fait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT tab.* FROM (SELECT table_name FROM mytables WHERE tab_id = 1) as tab
    Cependant, cette requête qui syntaxiquement est correcte, me retourne le résultat de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table_name FROM mytables WHERE tab_id = 1
    et non le contenu de ma table dont l'id est "1"...

    Avez-vous une idée de comment faire ? Si c'est possible ?
    Merci !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ta demande laisse à penser qu'il y a un problème de modélisation des données car stocker le nom d'une table dans une table, c'est plutôt inhabituel !

    Quel chemin t'a amené à une telle demande ?

  3. #3
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    il te retourne ce que tu lui demandes... si ton but est de faire une sélection de table dont tu fixerais le nom, c'est pas du tout comme ça...

    le seul moyen est de construire ta requête via une requête préparée pour laquelle tu définis la chaine de commande par une concaténation de ta requête (coupée au niveau de l'emplacement du nom de table) et du nom de table...

    tu ne peux non plus utiliser une variable pour avoir le nom d'une entité (nom d'une base, d'une table ou d'une colonne)

    c'est donc le seul moyen pour générer une requête dynamiquement sur l'une de ces choses...

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Merci pour vos réponses.

    J'ai effectivement des tables avec beaucoup de données, et j'essaie de voir comment je peux optimiser les temps d'accès aux données.
    Dans mon cas je ne vois grandement l’intérêt des requêtes préparées dans la mesure où je dois toujours récupérer mes données en plusieurs requêtes (récupérer d'abord le nom des tables puis les données à proprement parlé).

    Ceci dit le problème est plus complexe que cela et je vais continuer à réfléchir à la modélisation de mes données...

  5. #5
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    alors comment tu veux optimiser en rajoutant une couche pour rien

    regarde ta requête indentée:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tab.*
    FROM
      (SELECT table_name
       FROM mytables
       WHERE tab_id = 1) AS tab
    littéralement je lis la colonne table_name de mytables pour tab_id = 1 et je stocke la ligne dans la table temporaire tab puis je lis tout ce qu'il y a dans tab...
    ce qui correspond bien à:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT table_name
    FROM mytables
    WHERE tab_id = 1
    mais en ajoutant une table temporaire et une lecture intermédiaire par rapport à cette dernière requête...

    comprends mieux ce que tu as écrit?

    rien à voir avec je viens chercher le nom de la table par une requête puis j'exécute une autre requête en utilisant le nom de table obtenu...

    tu ne peux le faire qu'avec une requête préparée si c'est ce que tu avais à l'intérieur d'une procédure stockée, pour encapsuler les différentes requêtes nécessaires, ou en les enchainant coté langage serveur (php, java, etc)...

    pour reprendre ton exemple:
    Code sql : 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
    19
    delimiter $$
    drop procedure if exists test$$
    create procedure test(in valeur int)
    begin
      declare tname varchar(64) default null;
      SELECT table_name
        into tname
        FROM mytables
        WHERE tab_id = valeur;
      if tname is not null then
        @ordre=concat('select * from `',tname,'`');
        prepare exe from @ordre;
        execute exe;
        deallocate prepare exe;
      end if;
    end$$
     
    delimiter ;
    call test(1);

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    C'est effectivement ce que j'avais compris en cherchant un peu.

    Après c'est sûr que récupérer mes données en 2 ou 3 étapes il n'y a pas de soucis... Bien que je préfères le faire en Php, je trouve cela plus simple (je ne maîtrise pas trop les procédures en SQL), mais merci pour l'exemple.

    Je pense que si je veux optimiser quelque chose c'est plutôt coté organisation des données. Et du coup en prenant en compte les requêtes imbriquées (correctement) que je n'utilise pas tant que ça.

    Après j'avoue que pour la forme j'ai posé la question au cas où, j'aurai trouvé cela "joli", techniquement parlant !

    Merci pour vos réponses.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/10/2013, 15h50
  2. [Droits] INSERT et SELECT sur une table temporaire
    Par Bisûnûrs dans le forum Administration
    Réponses: 2
    Dernier message: 19/06/2008, 08h01
  3. Les résultats d'un Select sur une table
    Par naznaz dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/11/2007, 11h58
  4. Réponses: 6
    Dernier message: 08/02/2007, 14h41
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

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