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 :

Création de table dynamique


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 3
    Par défaut Création de table dynamique
    Bonjour,

    J'essaie d'écrire une requête SQL ... sans être sûr qu'elle soit possible.

    L'objectif est de transférer le contenu d'une première table dans une autre.

    Table 1
    id                    Type                Valeur
    1                     véhicule           voiture
    2                     véhicule           train
    3                     fruit                 pomme
    4                     légume            courgette
    5                     fruit                 orange
    
    Table 2
    id                   véhicule              fruit               légume
    1                    voiture
    2                    train
    3                                            pomme
    4                                                                  courgette
    5                                            orange
    
    Est-il possible d'écrire une requête qui crée la table 2 à partir de la table 1

    Merci de votre aide,

    Vence82

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 13
    Par défaut
    The syntax for the CREATE TABLE AS statement in MySQL is:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE [ IF NOT EXISTS ] new_table [ AS ] 
      SELECT expressions
      FROM existing_tables
      [WHERE conditions];
    Je viens de regarder la syntaxe sur MySQL ça doit être un truc comme ça.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 637
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    La question n'est pas très claire, le besoin est il de créer la STRUCTURE de la table2 à partir de la table1, ou bien d'en alimenter le CONTENU ?

    A priori la table 2 ne contient que 2 colonnes : ID et LIBELLE, c'est bien ça ?

    Pour alimenter le contenu, vous pouvez utiliser une requête de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into table2
          (id, libelle)
           values
          (select id
                , valeur
           from table1)

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Je pense qu'il y a un gros problème de formatage dans la présentation des tables, ce qui complique la lecture.

    De ce que j'ai compris, autant la modélisation 1 (model EAV) est très pénible à requêter, autant je ne comprends pas la modélisation 2, il y aurait une table avec pour colonnes (id,vehicule,fruit,legume) ?
    C'est pire que de mélanger les torchons et les serviettes...

    Vous devriez exposer clairement votre besoin pour avoir quelques conseils de modélisation, notamment dans le forum merise:
    https://www.developpez.net/forums/f2...thodes/merise/

    Sinon d'un point purement technique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into t2 (id,vehicule,fruit,legume)
    select id
         , case when type = 'vehicule' then valeur end as vehicule
         , case when type = 'fruit' then valeur end as fruit
         , case when type = 'legume' then valeur end as legume
      from t1

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 3
    Par défaut
    Bonjour,

    Merci de votre aide. En effet, la mise en forme n'était pas très heureuse.

    Je suis contraint sur la table 1, sur laquelle je dois lancer des requêtes du style : toutes les lignes dont véhicule = train OU légume = courgette. Mon idée était donc de passer par une table intermédiaire, créée à la volée. Dans sa construction, chaque colonne est un des types définis dans la table 1.
    La table alors créée devient simple à requêter puisqu'il "suffit" de faire une requête du style t2.vehicule = "train" OR t2.legume = "courgette".

    Les requêtes que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT type FROM t1 ;
    CREATE TABLE t2(id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, type_1 TEXT, type_2 TEXT
    (la liste des TYPE étant construite par une boucle PHP

    Et ensuite pour alimenter cette table, un script PHP qui boucle sur chaque type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO t2(type_1) SELECT valeurFROM t1 WHERE type= "type_1"
    Je sais que ce n'est pas le plus propre, mais ça a l'avantage de marcher. Pour la dernière requête, je vais essayer celle de skuatamad, elle m'a l'air bien plus propre que ma boucle PHP

    Merci

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Effectivement, le modèle EAV est une plaie pour les requêtes d'analyse.

    Par contre attention avec la création d'une table de travail à la volée, 2 tables ne peuvent pas avoir le même nom donc pour que 2 utilisateurs puissent requêter en même temps vous devez :
    - Gérer des noms différents de la table générée à la volée
    - OU utiliser une table temporaire qui dépendra de la session

    Mais vous pouvez aussi vous contenter de générer la requête d'analyse à la volée :
    A partir de la requête de récupération des différents types, vous générer en php la requête qui pivote les données pour lui donner la structure requêtable que vous utiliser en sous-requête.
    Utiliser max (case when) si un id peut être lié à plusieurs type, en pseudo code ça donnerait :
    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
     
    $liste_type = SELECT DISTINCT type FROM t1 ;
     
    select * 
      from (
    select id
          /*debut de génération des colonnes pivotées*/
          for ($liste_type) {
        , max(case when type = $liste_type then value end) as $liste_type
          }
          /*fin de génération des colonnes pivotées*/
     from t1 
    group by id
          ) t2
    where t2.vehicule = 'train' 
       OR t2.legume = 'courgette'
    Pour de meilleure performance, vous pouvez peut être également créer la table T2 une fois pour toute, et gérer son alimentation / modification de structure en script ordonnancé.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2013, 17h20
  2. script de création de table dynamique
    Par Etienne5685 dans le forum Développement
    Réponses: 2
    Dernier message: 07/09/2011, 14h38
  3. Création de table dynamique
    Par Bluchy dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/04/2010, 09h50
  4. Création de table dynamiquement Transact-SQL
    Par mickael28 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/01/2009, 09h45
  5. Création de table dynamique avec DataStage
    Par frabey dans le forum DataStage
    Réponses: 1
    Dernier message: 05/11/2008, 14h12

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