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 :

Lignes en une colonne


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut Lignes en une colonne
    Bonjour,

    J'ai une table ressemblant à ceci :

    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
     
    ID  SubmitId  EventId  FieldName    FieldValue
    ----------------------------------------------
    1      1         3     Nom          Lagaffe
    2      1         3     Prenom       Gaston
    3      1         3     Adresse      Rue 23
    4      1         3     Ville        FranquinCity
    5      1         3     ZIP          45600
    6      1         3     Telephone    386......
    7      2         3     Nom          Dulac
    8      2         3     Prenom       Michel
    9      2         3     Adresse      Chemin des bois 12
    10     2         3     Ville        Paris
    11     2         3     ZIP          75004
    12     2         3     Telephone    382000...
     
    Etc...
    et j'aimerais arrivé à avoir une colonne par FieldName (Nom, Prenom, Ville,...).

    Oui, je sais que la structure de la base n'est pas terrible mais je n'en suis pas responsable...
    J'ai beaucoup cherché sur le web mais je n'ai jamais réussi à trouver une solution exacte à mon problème...

    Quelqu'un aurait-il une idée ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par chaours Voir le message
    Oui, je sais que la structure de la base n'est pas terrible mais je n'en suis pas responsable...
    C'est un doux euphémisme ! Elle est carrément pourrie cette structure !

    Allez c'est mon jour de bonté... regarde du côté de GROUP_CONCAT.

    Mais je te conseille vivement de te pencher sur la renormalisation de ta BDD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Je vais essayer cette solution qui me semble bien mais si je voulais obtenir un nom de champ pour chaque valeur qui sont séparée par une "," par GROUP_CONCAT ??

    En tout cas déjà merci pour ton aide...

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    Citation Envoyé par chaours Voir le message
    Je vais essayer cette solution qui me semble bien mais si je voulais obtenir un nom de champ pour chaque valeur qui sont séparée par une "," par GROUP_CONCAT ??
    Non, effectivement, le GROUP_CONCAT ne te fera pas plusieurs colonnes...

    Dans le résultat que tu souhaites, quelle serait la clef ?

    Je te propose une solution ci-dessous fondée sur l'hypothèse que cette clef est la SubmitId, et que tu disposes d'une table des Submits (ce qui n'a rien d'indispensable, mais rend la solution plus explicite) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT S.SubmitId, N.Nom, P.Prenom, A.Adresse...
    FROM Submits S
      INNER JOIN TaTable N ON S.SubmitId = N.SubmitId AND N.FieldName = 'Nom'
      INNER JOIN TaTable P ON S.SubmitId = N.SubmitId AND P.FieldName = 'Prenom'
      INNER JOIN TaTable A ON S.SubmitId = N.SubmitId AND A.FieldName = 'Adresse'
    ...
    Evidemment, c'est le genre de requête qu'il est intéressant d'enregistrer dans une vue.

  5. #5
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    J'ajoute mon petit grain de sel, les colonnes N.Nom, P.Prenom, A.Adresse n'existant pas dans la table il convient de remplacer ces noms dans la projection du SELECT par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    N.FieldValue AS Nom, P.FieldValue AS Prenom, A.FieldValue AS Adresse
    me smeble-t'il...
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    J'ajoute mon petit grain de sel, les colonnes N.Nom, P.Prenom, A.Adresse n'existant pas dans la table il convient de remplacer ces noms dans la projection du SELECT par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    N.FieldValue AS Nom, P.FieldValue AS Prenom, A.FieldValue AS Adresse
    me smeble-t'il...
    Tu as parfaitement raison... merci de la correction

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Merci pour vos réponses et vos solutions...

    Je vais essayer ça mais j'avoue ne pas très bien comprendre le fonctionnement car je n'ai qu'une table et je vois des INNER JOIN...

    Je vous tiens au courant de mes essais...

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    oui, il s'agit d'utiliser plusieurs fois la même table sous des alias différents.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Ok,

    Merci Antoun pour cette précision !

    J'ignorais qu'on pouvait faire ça...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Après avoir testé vos solutions, il s'avère que la requête me retourne des millions (>32'000'000) d'enregistrements tous identiques au premier enregistrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT N.FieldValue AS Nom, P.FieldValue AS Prenom
    FROM MaTable
    INNER JOIN MaTable N ON N.FieldName = 'Nom'
    INNER JOIN MaTable P ON P.FieldName = 'Prenom'
    WHERE MaTable.EventId IN ( 3, 5 )
    J'ai essayé d'ajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GROUP BY MaTable.SubmitId
    mais sans succès...

    Avez-vous une idée pourquoi la requête me retourne autant de lignes ??
    La table contient 2200 enregistrements (lignes).

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    tu as un peu oublié la jointure principale...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ON S.SubmitId = N.SubmitId AND N.FieldName = 'Nom'

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    En ajoutant cela, Mysql me répond que la table "S" n'existe pas...
    Même si je l'insère dans le SELECT, Mysql donne une erreur...

    Je n'ai qu'une table...

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    OK, je suis allé trop vite, donc je reprends du début... peux-tu m'expliquer ce que sont le SubmitId et le EventId de ta table ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Merci pour vos messages et votre aide.

    Antoun
    Le SubmitId correspond à un ID pour regrouper toutes les lignes correspondant aux informations saisies par un utilisateur...
    Le EventId correspond au n° du formulaire qui contient son nom, sa période de validité, etc...

    Waldar
    Il faut que j'essaie ta solution, en attendant déjà merci !

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    et hop !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT N.EventId, N.FieldValue AS Nom, N.FieldValue AS Prenom, A.FieldValue AS Adresse...
    FROM TaTable N 
      INNER JOIN TaTable P ON S.EventId = N.EventId AND P.FieldName = 'Prenom'
      INNER JOIN TaTable A ON S.EventId = N.EventId AND A.FieldName = 'Adresse'
    ...
    WHERE N.FieldName = 'Nom'
    La requête de Waldar doit marcher également, mais devrait être plus longue (ce ne sera pas forcément sensible).

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ou plutôt tout le contraire, un seul table scan sera moins coûteux que sept !

  17. #17
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    à voir... j'aurais tendance à penser que tes agrégations vont être plus lourdes, mais bon...

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Par défaut
    Merci à vous !!!

    Vos solutions fonctionnent à merveille...

    J'ai eu de la peine à comprendre et à interpréter vos exemples mais ça marche.

    Un grand merci à vous Antoun et Waldar !

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

Discussions similaires

  1. Modifier l'enseble des lignes d'une colonne d'une table
    Par bencheikh dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/07/2006, 21h46
  2. Concaténer toutes les lignes d'une colonne
    Par metalcoyote dans le forum Oracle
    Réponses: 6
    Dernier message: 10/05/2006, 15h51
  3. Excel VBA - Dernière ligne d'une colonne
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/12/2005, 17h33

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