Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 08/09/2011, 18h57   #1
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : juin 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Matériel informatique

Informations forums :
Inscription : juin 2011
Messages : 13
Points : 14
Points : 14
Par défaut Jointure entre deux tables

Bonsoir.

J'essaie depuis un bon moment de faire une jointure assez compliquée. Mes recherches sur internet sont restées infructueuses.

J'ai deux tables : alertes_mps et members.

La table members, en simplifiée, a les champs mbs_id et mbs_pseudo.
La table alertes_mps, en simplifiée, a les champs alertesMps_idMbr, alertesMps_idResolveur. Ces deux id correspondent aux id de la table members.

Je veux récupérer les pseudos des deux membres.

Voici ma requête qui récupère, entre autres, le pseudo de idMbr (celui qui émet l'alerte).

Code :
1
2
3
4
5
6
SELECT *, DATE_FORMAT(mbs_lastConnect, "%d-%m-%Y-%H-%i-%s") AS dateConnectAut, DATE_FORMAT(alertesMps_date , "%d-%m-%Y-%H-%i-%s") AS alerteDate 
	FROM alertes_mps al 
	INNER JOIN members me ON (al.alertesMps_idMbr = me.mbs_id) 
	INNER JOIN members_infos mi ON al.alertesMps_idMbr = mi.mbsi_idMbr 
	INNER JOIN mp_conv mpc ON al.alertesMps_idConv = mpc.mpConv_id 
	WHERE al.alertesMps_resolue=?
PS : le champs mbs_lastConnect est la date de dernière connexion de idMbr, celui qui émet l'alerte.

Cette requête fonctionne très bien en prenant l'id de celui qui émet la requête (idMbr) mais sans prendre le pseudo de celui qui a résolu l'alerte (idResolveur). Si je fais un autre INNER JOIN ça bloque puisque SQL ne saura pas quoi faire.

J'espère que vous comprenez mon problème.

Merci par avance pour votre aide.

Bonne soirée.
Oneill887 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 23h46   #2
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
Évite la guerre des étoiles !

Puisque tu as deux membres à associer à tes alertes, il te faut deux jointures sur les membres :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT /* les colonnes nécessaires et pas étoile ! */ , 
    DATE_FORMAT(mbs_lastConnect, "%d-%m-%Y-%H-%i-%s") AS dateConnectAut, 
    DATE_FORMAT(alertesMps_date , "%d-%m-%Y-%H-%i-%s") AS alerteDate 
FROM alertes_mps al 
INNER JOIN members me1 ON al.alertesMps_idMbr = me1.mbs_id -- pour émetteur
INNER JOIN members me2 ON al.alertesMps_?????? = me2_id -- pour résolveur
-- voir aussi s'il te faut des infos des autres tables pour les deux membres dont deux autres jointures
INNER JOIN members_infos mi ON al.alertesMps_idMbr = mi.mbsi_idMbr 
INNER JOIN mp_conv mpc ON al.alertesMps_idConv = mpc.mpConv_id 
WHERE al.alertesMps_resolue = ?
__________________
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 09/09/2011, 09h44   #3
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
Je ne sais pas si un INNER JOIN est approprié pour le résolveur, à moins que l'alerte soit émise et résolue lors de l'insertion en table, .
Il serait peut-être judicieux de passer par une jointure externe, ce qui permettrait de récupérer vos tuples même si l'alerte n'a pas encore été résolue... A vous de voir en fonction de votre expression de besoins et de vos règles fonctionnelles.

Bon courage
__________________
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
Vieux 12/09/2011, 17h02   #4
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : juin 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Matériel informatique

Informations forums :
Inscription : juin 2011
Messages : 13
Points : 14
Points : 14
Merci à vous deux de prendre le temps de m'expliquer tout ça.

@CinePhil : j'ai testé ce que tu me proposes (en fait je l'avais déjà testé). Mais le problème c'est que je ne sais pas comment prendre le pseudo. Comment MySQL comprendra que le premier pseudo que je prends est celui de l'auteur de l'alerte et que le deuxième est celui du "résolveur". Comme j'écris $var['mbs_pseudo'] à ce moment là il ne sait pas lequel prendre ?

Ma solution est la suivante :

Code :
1
2
3
4
5
6
7
8
 
	SELECT *, DATE_FORMAT(mbs_lastConnect, "%d-%m-%Y-%H-%i-%s") AS dateConnectAut, DATE_FORMAT(alertesMps_date , "%d-%m-%Y-%H-%i-%s") AS alerteDate, me1.mbs_pseudo AS x, me2.mbs_pseudo AS y
	FROM alertes_mps al 
	INNER JOIN members me1 ON (al.alertesMps_idMbr = me1.mbs_id) 
	INNER JOIN members me2 ON (al.alertesMps_idResolveur = me2.mbs_id) 
	INNER JOIN members_infos mi ON al.alertesMps_idMbr = mi.mbsi_idMbr 
	INNER JOIN mp_conv mpc ON al.alertesMps_idConv = mpc.mpConv_id 
	WHERE al.alertesMps_resolue=?
Je sélectionne donc me1.mbs_pseudo que je stocke dans un alias x (et me2.mbs_pseudo dans y). Ça me paraît logique mais quand j'écris ça (et même sans mettre les alias) il ne me retourne aucun résultats. Ça doit venir de la jointure qui plante.

Citation:
Envoyé par CinePhil Voir le message
Merci je vais lire ça, ça semble passionnant puisqu'en plus ça touche aux performances de la requête.

Edit : j'ai essayé en faisant une jointure externe (LEFT JOIN) et ça ne fonctionne pas non plus.
Oneill887 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 15h17   #5
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : juin 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Matériel informatique

Informations forums :
Inscription : juin 2011
Messages : 13
Points : 14
Points : 14
Vous ne voyez pas d'où vient le problème ?
Oneill887 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h12   #6
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par Oneill887 Voir le message
Vous ne voyez pas d'où vient le problème ?
Dans la requête, le pseudo du requêteur est aliasé "x" et celui du résolveur est aliasé "y".

Donc tu récupère $var['x'] et $var['y']. Dans le premier t'as le requêteur, et dans le second, le résolveur...
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 22h55   #7
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : juin 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Matériel informatique

Informations forums :
Inscription : juin 2011
Messages : 13
Points : 14
Points : 14
Citation:
Envoyé par StringBuilder Voir le message
Dans la requête, le pseudo du requêteur est aliasé "x" et celui du résolveur est aliasé "y".

Donc tu récupère $var['x'] et $var['y']. Dans le premier t'as le requêteur, et dans le second, le résolveur...
Je sais. Sauf que cette requête ne retourne aucun résultats. Alors que si j'enlève le deuxième INNER JOIN sur la table members ça marche parfaitement (à l'exception que je ne récupère pas les deux pseudos...).
Oneill887 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h07.


 
 
 
 
Partenaires

Hébergement Web