Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2010, 12h11   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
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 :
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....
Anatol75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 12h24   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Votre problème est bien clair rassurez-vous.
Quel est votre SGBD ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 16h01   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

La requete suivante doit vous apporter ce que vous voulez
Code sql :
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 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2010, 10h44   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Un LIKE sans caractère générique % est équivalent à un =
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 17h36   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
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.
Anatol75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 17h40   #6
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
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.... ?
Anatol75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 17h54   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
DISTINCT fonctionne sur l'ensemble des colonnes du SELECT.
Autrement dit, ceci est inutile :
Code :
SELECT DISTINCT (A), B, C
C'est exactement pareil que cela :
Code :
SELECT DISTINCT A, B, C
Dans les deux cas, la distinction se fera sur le triplet de colonnes {A, B, C}.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2010, 20h35   #8
Invité de passage
 
Inscription : décembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 4
Points : 1
Points : 1
ah ouai, faudrait quand même que je me replonge dans mes cours de SQL si je remets la main dessus

Merci de l'info.
Anatol75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 00h59   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Il y a tout ce qu'il faut pas loin, chez SQLPro !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h41.


 
 
 
 
Partenaires

Hébergement Web