Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
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 09/09/2011, 17h31   #1
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
Par défaut [jointure] optimisation de requête ! aide svp

Bonjour le forum ,

J'ai une requête sql avec jointure (elle marche bien et me retourne le résultat souhaité).

Cependant je voudrais savoir si cette syntaxe est la mieux adaptée ou bien si elle peut être optimisée.

Votre aide me sera précieuse, je ne touche que rarement aux jointures. Merci.

Code :
1
2
3
4
5
SELECT u.* FROM user u
LEFT JOIN affectation_projet a
ON a.id_user=u.id_user
WHERE a.id_projet 
IN(SELECT id_projet FROM affectation_projet WHERE id_user =1)
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h41   #2
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
en gros je souhaite retourner les users qui sont dans les mêmes projets que le user dont le id = 1
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 21h07   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Comme je l'explique sur mon blog, mettre une condition de restriction (WHERE) sur la table de droite d'une jointure externe gauche revient à faire une jointure interne.

Par ailleurs, évite la guerre des étoiles !

Enfin, ta condition de restriction est équivalente à une nouvelle jointure sur la table affectation_projet et la jointure devrait être plus performante qu'une requête corrélée.

Code :
1
2
3
4
5
SELECT -- les colonnes nécessaires et pas étoile !
FROM user u
INNER JOIN affectation_projet a ON a.id_user = u.id_user
    INNER JOIN affectation_projet a2 ON a2.id_user = a.id_user
WHERE a2.id_user = 1
__________________
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 12/09/2011, 12h40   #4
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 64
Points : 28
Points : 28
Merci bcp de ton aide , ta réponse m'a bcp aidé .

il fallait changer la colonne de jointure du deuxième inner join pour retourner les collègues du user, la requête devient alors comme suit

Code :
1
2
3
4
5
6
 
SELECT u.*
FROM user u
INNER JOIN affectation_projet a ON a.id_user = u.id_user
    INNER JOIN affectation_projet a2 ON a2.id_projet = a.id_projet
 WHERE a2.id_user = 1
et pour ne pas retourner le collaborateur en question il sufit d'ajouter le contrôle suivant

Code :
1
2
3
4
5
6
7
SELECT u.*
FROM user u
INNER JOIN affectation_projet a ON a.id_user = u.id_user
    INNER JOIN affectation_projet a2 ON a2.id_projet = a.id_projet
          and a.id_user <> 1
WHERE a2.id_user = 1
Merci encore de ta reponse , je note comme résolu
abdess6600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 14h15   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par CinePhil Voir le message
Enfin, ta condition de restriction est équivalente à une nouvelle jointure sur la table affectation_projet et la jointure devrait être plus performante qu'une requête corrélée.

Code :
1
2
3
4
5
SELECT -- les colonnes nécessaires et pas étoile !
FROM user u
INNER JOIN affectation_projet a ON a.id_user = u.id_user
    INNER JOIN affectation_projet a2 ON a2.id_user = a.id_user
WHERE a2.id_user = 1

Peut etre plus performante mais surement pas iso fonctionnelle ...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh 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 01h28.


 
 
 
 
Partenaires

Hébergement Web