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 :

Regroupement en une ligne du résultat de plusieurs sous requetes ?!


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Regroupement en une ligne du résultat de plusieurs sous requetes ?!
    Bonjour,

    Je dois mal m'y prendre...

    J'ai une première table 'Annuaire' contenant la liste de tous les noms et prénoms des utilisateurs de mon site ainsi que la clef étrangère de leurs téléphones.

    La table et du style :
    Nom | Prenom | IdTel
    Toto marc 1
    Toto marc 2
    Tata julien 3

    La seconde table 'telephone' contenant les informations sur les numéros de téléphones est de la sorte :
    IdTel | Telephone | Commentaire
    1 0202020202 Tel Perso
    2 0606060606 Tel Portable
    3 0203030303 Tel Perso

    J'ai fait la requête suivante :

    SELECT
    A.nom,
    A.prenom,
    (SELECT T.Telephone FROM TableTelephone T WHERE T.Commentaire = 'Tel Perso' AND T.IdTel = A.IdTel) AS TelephonePerso,
    (SELECT T.Telephone FROM TableTelephone T WHERE T.Commentaire = 'Tel Portable' AND T.IdTel = A.IdTel) AS TelephonePortable
    FROM
    Annuaire A;

    J'obtiens le résultat :

    Nom | Prenom | TelephonePerso | TelephonePortable
    Toto Marc 02022020202 NULL
    Toto Marc NULL 0606060606
    Tata Julien 020303030303 NULL

    C'est un bon début mais je souhaiterais obtenir :

    Nom | Prenom | TelephonePerso | TelephonePortable
    Toto Marc 02022020202 0606060606
    Tata Julien 020303030303 NULL

    J'ai essayé plusieurs solutions pour regrouper tout ça mais sans grand succès...

    Si quelqu'un à une idée ou une suggestion, je suis preneur !
    Merci par avance pour vos lumières.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut essaye la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    A.nom,
    A.prenom, 
    T1.Telephone as TelephonePerso,
    T2.Telephone as TelephonePortable 
    FROM Annuaire A
    LEFT JOIN TableTelephone T1 on T1.IdTel = A.IdTel and T1.Commentaire = 'Tel Perso'
    LEFT JOIN TableTelephone T2 on T2.IdTel = A.IdTel and T2.Commentaire = 'Tel Portable'
    Guillaume

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour Guillaume,

    Hélas j'ai exactement le même résultat que ce soit avec les jointures ou avec les sous-requêtes...

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Ton problème est une demande récurrente, sur ce forum, il n'y a pas de solution simple :

    cf cette proposition : Sélection multivaluée (fonctionne sur SQL Serveur ou Oracle : norme SQL 3)

    On peut également voir cela comme un problème de cosmétique.

    Concernant la modélisation, si tu peux la refaire, c'est préférable : il vaudrait mieux gérer :
    - une table personne (avec gestion de l'unicité)
    - une table téléphone (type, n°)
    - une table annuaire (table de liens entre personne et téléphones)

    Avec une telle modélisation, ta requête ne poserait aucun souci (avec des sous-requêtes).

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci Xo pour ta réponse !

    Effectivement je partage ton avis sur la structure des tables que j'ai suivi mais je ne voulais pas trop compliquer mon explication !
    ;-)

    Effectivement j'ai une table contenant la liste de mes utilisateurs (nom, prenom, IdentifiantUtilisateur, etc.)
    Une autres pour la listes de tous les téléphones (Numéro, indicatif, type, commentaire, identifiantTelephone, etc)
    et un troisième table pour faire l'association Utilisateurs/Numéros (IdentifinatTelephone, IdentifiantUtilisateur)

    En tous cas c'est la structure que j'ai retenu en faisant le MCD Entités / Associations.

    Bon il est vrai que j'aurai aimé faire de la "cosmétqie" en mettant tout cela de façon bien rangée dans une 'Vue Annuaire'...
    ;-)

    Merci à tous pour vos points de vues sur la question...

Discussions similaires

  1. Obtenir une ligne de résultat dans tout les cas
    Par Apo94 dans le forum Développement
    Réponses: 5
    Dernier message: 02/02/2011, 13h06
  2. Réponses: 10
    Dernier message: 02/09/2010, 10h19
  3. Récuperer une seule ligne de résultat sur plusieurs
    Par vever dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/11/2009, 01h06
  4. [MySQL] Recherche fonction donnant tableau d'une ligne du résultat d'une requête
    Par zakuli dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/02/2009, 19h56
  5. regroupement sur une ligne
    Par rattlehead83 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/02/2006, 16h46

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