Problème de jointure dans une requête: JOIN ou table temporaire?

Résolu/Fermé
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - 26 févr. 2013 à 14:44
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - 5 mars 2013 à 10:24
Bonjour,
Je travaille sur une BDD qui stocke les données d'un arbre généalogique. J'ai une table qui contient la liste des personnes de l'arbre (table_personnes), et une table qui contient la liste des mariages (table_mariages). La table des mariages ne stocke pas le nom des époux (ce serait redondant par rapport à la table des personnes), mais associe l'ID d'un homme (id_h) à celui d'une femme (id_f) (vous m'excuserez mais je n'ai pas encore mis tout ça à jour avec les mariages mixes.. :). La table mariage contient aussi l'ID du mariage (id_m). Bien entendu une personne qui s'est mariée plusieurs fois apparaitra plusieurs fois dans la table mariage.

On a donc:
table_personnes (p): id, nom, prenom
table_mariage (m): id, id_h, id_f

Je voudrais faire une requête pour obtenir les nom et prénom de l'époux, ceux de l'épouse et l'ID du mariage, le tout dans l'ordre alphabétique du nom de l'époux.

J'ai commencé avec ce bout de requête, mais la suite m'échappe.

SELECT p.nom nom_h, p.prenom prenom_h, m.id_f, m.id
FROM p
INNER JOIN m
ON m.id_h = p.id


Cela me donne donc sur la même ligne: nom_h, prenom_h, id_f, id_m

A partir de là est-ce que:
1. je peux stocker ce premier résultat dans une table temporaire et refaire la même requête pour obtenir les nom_f et prenom_f à partir de id_f? (je veux bien des pistes car je ne sais pas faire...)

2. ou y a-t-il une solution magique avec la syntaxe de JOIN pour avoir aussi du premier coup les nom_f et prenom_f à la place de la colonne id_f?

Merci d'avance :)




5 réponses

arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
Modifié par arth le 27/02/2013 à 01:34
Ne serait-il pas préférable de tout centrer sur la table MARIAGE et non la table PERSONNES à ce moment là?

Pour moi cela devrait se présenter ainsi :

La table mariage contient 1 seul ID, celui du mariage, et eventuellement plusieurs autre champs, comme la date du mariage, un éventuel nom à ce mariage type générique mariage de M. XY et Mme YY

TableMariage

IDMariage

Après s'il s'agit de mariage, epoux et epouses devraient à mon sens être dans une table séparée

TableEpoux :

IDMariage ==> ID du mariage
NomEpoux
PrenomEpoux

TableEpouse :

IDMariage ==> ID du mariage
NomEpouse
NomJeuneFille(si nécessaire)
PrenomEpouse

Pour sélectionner le nom des personnes en fonction de l'ID du mariage, cela devrait donner :

SELECT H.NomEpoux,H.PrenomEpoux,F.NomEpouse,F.PrenomEpouse 
FROM TableMariage AS M 
INNER JOIN TableEpoux   AS H ON H.IDMariage = M.IDMariage  
INNER JOIN TableEpouse AS F  ON F.IDMariage = M.IDMariage  
WHERE M.IDMariage = '2'  ; # UN ID Quelconque mais qui existe 


Sinon pour un classement plus global trié par ordre alphabétique :

SELECT M.IDMariage,H.NomEpoux,H.PrenomEpoux,F.NomEpouse,F.PrenomEpouse 
FROM TableMariage AS M 
INNER JOIN TableEpoux   AS H ON H.IDMariage = M.IDMariage  
INNER JOIN TableEpouse AS F  ON F.IDMariage = M.IDMariage  
ORDER BY H.NomEpoux ASC; 




Le loup, solitaire et mystérieux.
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
27 févr. 2013 à 13:07
Merci de ta réponse arth, ta solution fonctionne effectivement mieux pour faire les requêtes, mais ça me semble un peu compliqué (4 tables) et surtout ça me pose deux problèmes:

1/ J'ai besoin de relier les époux/épouses à la liste des personnes de façon bien claire: la seule chose qui identifie de façon univoque une personne c'est son ID, celui de la table personnes. En effet quid des personnes qui ont les mêmes noms et prénoms? De plus j'ai une page du site qui permet de voir toutes les infos concernant une personne (dates de naissance, ses enfants, son (ses) mariage(s)...) ; si je ne mets pas les ID des époux dans la table mariage tout ceci est irrécupérable (le nom ne suffit pas à identifier une personne).

2/ Je trouve que c'est redondant et une perte de temps/ressource de devoir re-écrire le nom des époux dans la table mariage alors que toutes ces infos sont déjà dans la table des personnes.

Bref, je vais rester avec mon organisation des données, mais j'aimerais bien savoir:

1/ si on peut faire une "double jointure" sur une même table: joindre la table des personnes à la table des mariage pour récupérer le nom des époux, et joindre les même tables pour récupérer le nom des épouses.

2/ si je dois passer par une table temporaire (à l'issue de la requête que j'ai écrite ci-dessus) et refaire la même requête sur la table temporaire.

Merci de ton aide :)
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
Modifié par arth le 27/02/2013 à 14:41
Hmmm spa faux ! :-)

Ceci dit je n'ai pas réécrit le nom des époux dans la table mariage. Il n'y a par ailleurs que 3 tables :-)

Il y a juste l'ID du mariage qui conduit de l'autre côté dans la table PERSONNES à avoir deux personnes qui ont le même ID de mariage.

Je pense que mon point de vue est biaisé car s'il s'agit d'arbre généalogique, alors il manque des données, dont les enfants/parents des époux/épouses.

Il faut tout prendre en compte à ce moment là.

EDIT : Cela dépend aussi de quels sont les champs de recherche dans les pages du sites. Mais comme expliqué cela ne me semble pas trop compliqué

Le loup, solitaire et mystérieux.
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
28 févr. 2013 à 10:17
Jeje merci encore :) Mais ça fait des années que je suis là dessus, et je suis sur le point de finir... :D et je dois avouer que je ne vais pas réorganiser mes tables maintenant, et puis j'y ai beaucoup réfléchi et c'est cette façon de faire qui me convient le mieux.

Bon, sinon je cherche toujours une réponse à mes questions de requête... Je crois que je vais aller bucher un peu les table temporaires, car la solution magique ne semble pas exister...

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
5 mars 2013 à 10:24
Allez, histoire de conclure cette histoire, avec les tables temporaires ça donne:


$requete1 = "CREATE TEMPORARY TABLE tempo(id smallint(6),nom_h varchar(50),prenom_h varchar(50),id_f smallint(6))";

$requete2 = "INSERT INTO tempo SELECT table_mariage.id, table_personnes.nom nom_h, table_personnes.prenom prenom_h, table_mariage.id_f FROM table_personnes INNER JOIN table_mariage ON table_mariage.id_h = table_personnes.id";

$requete3 = "SELECT tempo.nom_h, tempo.prenom_h, tble_personnes.nom nom_f, table_personnes.prenom prenom_f, tempo.id FROM table_personnes INNER JOIN tempo ON tempo.id_f = table_personnes.id ORDER BY nom_h, prenom_h, nom_f";	

mysql_query($requete1);
mysql_query($requete2);
$reponse = mysql_query($requete3);


Merci encore de votre aide :)
0