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

Langage SQL Discussion :

Récupération de données depuis des tables existantes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 760
    Par défaut Récupération de données depuis des tables existantes
    Bonjour,

    Je dois récupérer des données dans une base MySQL existante pour l'injecter dans un fichier Excel (qui servira a alimenter un moulinette d'importation dans une nouvelle application).

    Je tente de récupérer les données sous forme d'une ligne par objet importé, mais dans la base actuelle j'ai des infos sous forme ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Table OBJET 
    - ID_OBJ
    - Nom_OBJ
    - etc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Table DETAIL
    - ID_DET
    - ID_OBJ
    - Type_DET
    - Valeur_DET
    ...


    Il y a une relation entre les tables via le ID_OBJ, je peux donc facilement récupérer les détails de mon objet, mais comme il y a plusieurs lignes de détails pour chaque objet, je récupère autant de lignes que de détails.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    1    chaise    120 
    1    chaise    45
    1    chaise    28
    1    chaise    blanc
    2    tabouret    85
    2    ...
    Le Type_DET sont bien structurés , par exemple [type_DET <= Hauteur / Largeur / Profondeur / couleur / ...)

    J'essaie de récupérer une seule ligne mon objet sous forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1/ chaise/  120/ 45/ 28/ blanc
    2 / Tabouret / ...
    En sachant que dans la colonne x = un type de détail.

    Je patauge un peu , ne sachant comment dire à la colonne [couleur] = la valeur de la ligne du fichier détail dont le type est "couleur" ...

    Ce serait possible ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 630
    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 630
    Billets dans le blog
    10
    Par défaut
    Avec MySQL, c'est group_concat qu'il faut utiliser, pour les autres SGBD, c'est string_agg.
    Mais attention, si certaines valeurs sont facultatives, le résultat sera difficile à exploiter

    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
    with T1(C1, C2, C3) as
        (select 'table',  'largeur',  '100'   union all
         select 'table',  'longueur', '140'   union all
         select 'table',  'hauteur',  '080'   union all
         select 'chaise', 'largeur',  '050'   union all
         select 'chaise', 'longueur', '050'   union all
         select 'chaise', 'hauteur',  '120'   union all
         select 'chaise', 'couleur',  'chêne'
        )
    select C1
         , GROUP_CONCAT(C3 SEPARATOR '/') as liste
    from T1
    group by C1


    Résultat :

    C1 liste
    chaise 050/050/120/chêne
    table 100/140/080

  3. #3
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 760
    Par défaut
    Hello, merci pour ton aide.

    je ne comprends pas trop ta requête, désolé !

    Dans cette dernière tu mets les valeurs que je voudrais trouver, au départ, je ne connait pas les valeurs des type pour les objets.

    Ou alors… je suis passé complètement à côté de ta solution

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 630
    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 630
    Billets dans le blog
    10
    Par défaut
    La requête que je propose effectue un regroupement par objet (GROUP BY) en concaténant toutes les valeurs (GROUP_CONCAT) séparées par des "/" comme demandé dans l'expression de besoin :

    Citation Envoyé par wd_newbie Voir le message
    J'essaie de récupérer une seule ligne mon objet sous forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1/ chaise/  120/ 45/ 28/ blanc
    2 / Tabouret / ...
    Mais comme je l'indiquais précédemment

    Citation Envoyé par escartefigue Voir le message
    Mais attention, si certaines valeurs sont facultatives, le résultat sera difficile à exploiter
    Le résultat de ma requête est strictement conforme à l'attendu, mais difficile à interpréter si les valeurs ne sont pas toujours dans le même ordre ou que certaines sont facultative et ce à cause de l'absence du libellé de la mesure dans le résultat (ex : 120 peut aussi bien être la longueur que la largeur, rien dans le résultat ne l'indique).

    Pour savoir à quelle type de valeur on a affaire, on peut procéder comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C1
         , GROUP_CONCAT(concat(C2, ':', C3) SEPARATOR ' / ') as liste
    from T1
    group by C1

    Ce qui donne un résultat différent de celui demandé, mais exploitable quoi qu'il arrive :

    C1 liste
    chaise largeur:050 / longueur:050 / hauteur:120 / couleur:chêne
    table largeur:100 / longueur:140 / hauteur:080

  5. #5
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 760
    Par défaut
    Bon en me relisant, je crois que je ne me suis pas vraiment bien expliqué mon besoin :

    Quand j'ai dit :


    J'essaie de récupérer une seule ligne mon objet sous forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1/ chaise/ 120/ 45/ 28/ blanc
    2 / Tabouret / ...


    En sachant que dans la colonne x = un type de détail.
    Ce n'est pas de concaténer les valeurs que doit effectuer, mais récupérer dans la table Détails l'ensemble des options d'un objet qui se trouve dans cette table sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID_DET	ID_OBJ  Type_DET	Valeur_DET
    1	1	Hauteur		120
    2	1	Largeur		80
    3	1	Couleur		Blanc
    etc...
    Quand je fait une requête avec jointure de OBJET, Details je récupère autant de lignes que de détails liés à mon objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1	Chaise 		Hauteur 	120
    1	Chaise		Largeur		80
    1	Chaise		Couleur 	Blanc	
    2	Tabouret	Hauteur		80
    2	Tabouret 	etc...

    L'idée serait de récupérer uniquement une ligne par objet , et dans cette ligne avoir tous les détails (une valeur par colonne)

    Un truc du style (sur l'idée - ne pas regarder le SQL !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Objet.*, (Detail.Valeur_DET WHERE Type_DET = 'hauteur') AS Hauteur, (Detail.Valeur_DET WHERE Type_DET = 'largeur') AS Largeur
    FROM Objet, Details
    WHERE Objet.ID_OBJ = Details.ID_OBJ

    Ce qui serait cencé me donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID_OBJ	Nom_OBJ		Hauteur	Largeur Couleur
    1	Table		120	80	Blanc
    2	Tabouret	80	60	Gris
    3 	...

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 630
    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 630
    Billets dans le blog
    10
    Par défaut
    En ce cas, vous cherchez à faire un pivot.

    La solution à mettre en œuvre dépend du SGBD et du nombre de types possibles par objet.

    Voici UN LIEN qui donne les différentes solutions sous SQL server, à adapter au dialecte MySQL selon la version qui est la votre.

Discussions similaires

  1. [MySQL-5.7] Importer des données depuis une table db
    Par lazeli.sabrina dans le forum MySQL
    Réponses: 5
    Dernier message: 16/05/2017, 19h16
  2. Réponses: 1
    Dernier message: 26/08/2013, 17h24
  3. Réponses: 9
    Dernier message: 26/03/2011, 09h46
  4. [MySQL] récupérer des données depuis une table mysql
    Par godbless dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/10/2008, 13h04
  5. Liste des tables existantes dans une base de données
    Par Lorenzole+bo dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/11/2007, 20h15

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