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 :

Aide requête jointure et distinct


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut Aide requête jointure et distinct
    Bonjour,

    Je sollicite de l'aide pour résoudre un petit problème d'unicité de lignes dans une requête avec une jointure, si certains sont en mesure de m'apporter une réponse de les remercie d'avance.

    Mon besoin :
    J'ai une table avec des acteurs, et une table avec des adresses (de 0 à n adresse par acteur).
    Mon besoin est de récupérer en une requête SQL une liste des acteurs avec pour chacun d'eux la ville de leur adresse s'il y en a une (mais de limiter le résultat à une ligne par acteur, en gros si un acteur a plusieurs adresses je ne veux en récupérer qu'une seule peu m'importe laquelle).

    Mon Problème :
    Mon problème c'est donc que lors de la jointure, je veux récupérer toutes les lignes de ma table de gauche (bd_acteurs), et compléter par ce qui est trouvé dans la table de droit (bd_adresses), mais je voudrais limiter ma jointure à un seul résultat pour la table de droite, et je n'y arrive pas car le LEFT JOIN semble prioritaire sur mon Distinct du SELECT.

    Exemple :
    Table bd_acteurs (id_acteur, nom, prenom) :
    1 : Martin : Jean
    2 : Martin : Paul
    3 : Durand : Michel

    Table bd_adresses (id_acteur, ville)
    1 : Paris
    1 : Nantes


    Ma requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT(a.id_acteur), a.nom, a.prenom, d.ville 
    FROM bd_acteurs a 
    LEFT JOIN bd_adresses d ON d.id_acteur = a.id_acteur 
    WHERE a.nom like 'Martin';
    PS : Ce n'est pas exactement ma requête mais j'ai simplifié le nombre de champs pour l'exemple.

    Résultat obtenu :
    1 : Martin : Jean : Paris
    1 : Martin : Jean : Nantes
    2 : Martin : Paul : NULL

    Résultat souhaité :
    1 : Martin : Jean : Paris (ou Nantes peu importe)
    2 : Martin : Paul : NULL

    Je ne sais pas si je suis assez clair....

  2. #2
    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
    Votre problème est bien clair rassurez-vous.
    Quel est votre SGBD ?

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    La requete suivante doit vous apporter ce que vous voulez
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.id_acteur, a.nom, a.prenom, MAX(d.ville) 
    FROM bd_acteurs a 
    LEFT JOIN bd_adresses d ON d.id_acteur = a.id_acteur 
    WHERE a.nom like 'Martin';
    GROUP BY a.id_acteur, a.nom, a.prenom

    Néanmoins, elle n'est pas très optimisée (calcul d'un MAX couteux et inutile)
    Indiquez votre SGBDR, on pourra surement trouver mieux que ca !

  4. #4
    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
    Un LIKE sans caractère générique % est équivalent à un =
    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 !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Merci de vos réponse, je vais déjà tester cette première requête.

    Mon SGBD je ne suis pas sûr, je suis hébergé chez OVH donc je passe par PhpMyAdmin mais le SGBD derrière je ne sais pas. Mais bon de toute façon je ne sais pas encore sur quel serveur sera le site à terme, donc je préfère éviter une solution spécifique à un SGBD.


    Pour le like sans '%' je sais, mais en fait j'ai simplifié, en réalité c'est un système de recherche qui autorise la saisie de '%' donc j'ai fais au plus vite en faisant un like même si l'utilisateur n'a pas saisi de '%', j'améliorerai ça par la suite.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    La requête donnée fonctionne très bien merci à vous, par contre comment se fait il que le MAX fonctionne là où mon DISTINCT ne marchait pas, ce n'était donc pas un problème de priorité du LEFT JOIN.... ?

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

Discussions similaires

  1. Aide requête SQL (jointure ?)
    Par BertoX dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/10/2010, 14h36
  2. Aide sur requête jointures
    Par almoha dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/08/2010, 13h49
  3. Aide requète avec jointure
    Par StanmaD dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/11/2006, 23h55
  4. Problème requête jointure
    Par Isa31 dans le forum Langage SQL
    Réponses: 36
    Dernier message: 16/05/2005, 13h46
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

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