infos croisées entre deux tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : infos croisées entre deux tables

par Cyrano » 14 oct. 2006, 20:40

Absolument : modélise, c'est une étape cruciale et importante : dans le cas présent, ne t'inquiète pas des difficultés à créer des liens entre les données, commence par les structurer de façons cohérente. Pour l'exemple présent, on fait très facilement une auto-jointure d'une table sur elle même pour lister les enfants d'une ligne s'il y en a ou sur un plan plus général rechercher les filiations.

N'oublie surtout pas qu'une application développée sur une base mal conçue au départ, c'est une horreur à modifier ou à débogguer (et encore, "horreur", c'est un doux euphémisme).

par mankind » 14 oct. 2006, 20:04

merci, il va falloir que je mette ça sur papier pour y voir plus clair...

par Cyrano » 14 oct. 2006, 19:35

Le fait que ce soient des enfants biologiques ou non n'a aucune importance, le résultat est le même et je dirais en outre que la comparaison peut permettre de rendre plus compréhensible le problème.

Au lieu de deux tables parent et enfant, imagine simplement une seule table personne ou projet comme tu voudras, mais contenant d'abord une clé primaire, et en clé étrangère soit 0 par exemple pour signifier que cette personne/projet n'a pas de parent, soit la valeur de la clé primaire de son parent... qui est dans la même table. Tu pourras de cette manière avoir autant de niveaux de profondeur que tu voudras alors qu'avec deux tables, tu seras limité à un seul niveau.

par mankind » 14 oct. 2006, 18:02

Ah - je me rends compte qu'à vouloir simplifier ma question j'ai dû rendre l'énoncé absurde. Il ne s'agit pas d'enfants et de parents biologiques mais de projets de recherches principaux et secondaires qu'on appelle projet parents et projets enfants (et un projet enfant peut être projet parent d'autres).

J'ai pensé faire une table "info" qui regroupe toutes les infos concernant un projet et qui lui donne notamment un nom et un identifiant unique, et puis une table "parent_enfant" qui regroupe toutes les relations inter-projets.

Pour cette table "parent_enfant" j'utilise trois champs (un champ id unique, un champ "parent" qui contient l'id du projet qui sera considéré comme parent, et un champ "enfant" qui contient l'id du projet qui lui sera subordonné.

exemple :

parent = id 1 enfant = id 2
parent = id 2 enfant = id 6
parent = id 2 enfant = id 7
parent = id 6 enfant = id 14

Autrement dit
Le projet 1 a pour enfant le projet 2.
Et le projet 2 est lui-même parent des projets 6 et 7.

et donc j'arrive à récupérer la liste des id des enfants pour un projet parent défini, mais pas à afficher les noms.

j'espère que c'est plus clair expliqué comme ça...

par Cyrano » 14 oct. 2006, 16:51

Sans vouloir te décevoir, je flaire à 100km l'erreur de conception : pourrais-tu nous décrire la structure de tes tables en expliquant tes choix. J'ai un sérieux doute sur la perennité de ton application : que feras-tu quand ceux qui sont aujourd'hui des enfants auront à leur tour des enfants ? :-k Et demande-toi s'il est judicieux d'avoir deux tables au lieu d'une seule avec une clé étrangère identifiant une personne de la même table comme son parent...

infos croisées entre deux tables

par mankind » 14 oct. 2006, 16:31

Salut,

Dans ma table "parent_enfant", je récupère les id d'une liste d'enfants associés à l'id d'un parent.
$select = 'SELECT * FROM parent_enfant where parent='.$idparent.'';
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);
if($total) {
while($row = mysql_fetch_array($result)) {
$liste_enfants ''.$row['enfant'].'<br>';
}}
Exemple :
1
3
6

J'aimerais ensuite récupérer le nom de ces enfants. Mais ces infos sont stockées dans une autre table appelée "info".

Pour récupérer le nom de l'enfant ayant pour id 1, il suffirait de faire :
$select = 'SELECT * FROM info where id=1';
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);
if($total) {
while($row = mysql_fetch_array($result)) {
echo ''.$row[nom].'<br>';
}}
Mais comment faire pour que cela se fasse successivement pour l'id 1, puis 3 puis 6 etc... (id récupérées dans la variable $liste_enfant du code précédent.

J'imagine qu'il faut faire appel aux tableaux et aux boucles for ? C'est le truc que j'ai jamais compris...

merci de votre aide.