Problème de jointure dans une requête: JOIN ou table temporaire?
Résolu
chantaussel
Messages postés
137
Date d'inscription
Statut
Membre
Dernière intervention
-
chantaussel Messages postés 137 Date d'inscription Statut Membre Dernière intervention -
chantaussel Messages postés 137 Date d'inscription Statut Membre Dernière intervention -
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.
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 :)
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 :)
A voir également:
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de pomme mais pas de pomme de terre ? pix
- Impossible de supprimer une page word - Guide
- Creation de site web - Guide
- Google moteur de recherche page d'accueil - Guide
- Web office - Guide
- Ouvrez cette page. dans le code de la page, modifiez la couleur de fond de la classe .pix. un code de 4 chiffres doit apparaître dans la grille. lequel ? ✓ - Forum Programmation
5 réponses
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 :
Sinon pour un classement plus global trié par ordre alphabétique :
Le loup, solitaire et mystérieux.
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.
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 :)
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 :)
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.
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.
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+
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+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Allez, histoire de conclure cette histoire, avec les tables temporaires ça donne:
Merci encore de votre aide :)
$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 :)