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 :

Nom de table à partir de la valeur d'un champs parent


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut Nom de table à partir de la valeur d'un champs parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT (SELECT T.name FROM E.e_type T WHERE T.id = E.e_id) AS title, E.contents
    FROM quests_steps E
    WHERE quest_id = 8;
    Le problème est en ROUGE. Il n'en veux pas. Par contre si je remplace ce qui est en rouge par un nom de table probable ça fonctionne très bien mais seulement avec un seul type.

    Etant donné que le type est variable il faudrait que je puisse déterminer le nom de la table a partir d'un champ parent. Comment faire ?

    J'aurai très bien pu faire ça avec un CASE WHEN mais le problème c'est que si je rajoute un type je devrait ajouter un WHEN et surtout, cela fait une requete beaucoup trop longue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CASE 
    WHEN E.e_type = 'pnjs' THEN (SELECT T.name FROM pnjs T WHERE T.id = E.e_id)
    WHEN E.e_type = 'objets' THEN (SELECT T.name FROM objets T WHERE T.id = E.e_id)
    WHEN E.e_type = 'potions' THEN (SELECT T.name FROM potions T WHERE T.id = E.e_id) 
    END AS title, E.contents
    FROM quests_steps E
    WHERE quest_id = 8;
    En vert, les différents nom de table possible, ...pour le moment ! Liste qui peux etre modifié a tout moment

  2. #2
    Expert éminent sénior
    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
    La BDD information_schema stocke toutes les informations sur les objets hébergés par le serveur. L'idée ci-dessous est d'aller chercher le nom de la table dans le schéma information_schema.
    Je propose deux syntaxes mais pas sûr que ça fonctionne :

    Ca je crains que ça ne fonctionne pas parce que la requête sur information_schéma retournera plus d'une ligne donc plus d'une table à joindre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T.name AS title, E.contents
    FROM taBDD.quests_steps AS E
    INNER JOIN (
      SELECT TABLE_NAME AS s
      FROM information.schema.TABLES
      INNER JOIN taBDD.quests_steps AS q ON s.TABLE_NAME = q.e_type
    ) AS T ON E.e_id = T.id
    WHERE E.quest_id = 8
    Ca fonctionnera peut-être mieux car je fais la liaison directe avec le bon nom de table mais comme l'alias E n'existe pas dans la sous-requête c'est pas sûr non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T.name AS title, E.contents
    FROM taBDD.quests_steps AS E
    INNER JOIN (
      SELECT TABLE_NAME AS s
      FROM information.schema.TABLES
      WHERE s.TABLE_NAME = E.e_type
    ) AS T ON E.e_id = T.id
    WHERE E.quest_id = 8

  3. #3
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut
    Ca ne fonctionne pas à cause de l'alias comme tu présenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T.name AS title, E.contents
    FROM quests_steps AS E
    INNER JOIN (
    SELECT TABLE_NAME
    FROM information_schema.TABLES AS S
    WHERE S.TABLE_NAME = E.e_type
    ) AS T ON E.e_id = T.id
    WHERE E.quest_id =8
    Un equivalant :
    N'aime pas non plus l'alias
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T.name AS title, E.contents
    FROM quests_steps AS E
    INNER JOIN (
    SHOW TABLES FROM  `mabase` WHERE  `Tables_in_mabase` =  E.e_type
    ) AS T ON E.e_id = T.id
    WHERE E.quest_id =8
    Je trouve ça bizar qu'on ne puisse pas utiliser l'alias. Doit bien y avoir un moyen

Discussions similaires

  1. Réponses: 10
    Dernier message: 18/05/2013, 21h54
  2. Réponses: 5
    Dernier message: 15/11/2011, 13h26
  3. Réponses: 8
    Dernier message: 10/10/2006, 11h58
  4. Réponses: 5
    Dernier message: 21/05/2006, 14h23
  5. Réponses: 6
    Dernier message: 01/03/2006, 15h55

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