Je coince sur un problème MySQL/PHP

Bonjour,

J’ai une table nommée “formation” qui contient notamment les champs id, module, obj, et surtout un champ famille_id qui donne pour une formation donnée l’id (provenant d’une autre table nommée “famille”) de la famille de cette formation, c’est-à-dire concrètement :

si famille_id contient par exemple (13,18,21), cela fait référence à la table "famille" avec

id_fam, nom_fam
13, Gestion service au Client
18, Management transverse Client
21, Marketing

Comment faire une requête PHP qui affichera une page HTML avec module, obj, nom_famille en clair ?

Donc en gros comment faire le lien entre l’id_fam de la table “formation” et le nom de la famille (nom_fam) dans la table “famille” ?
Si c’est une jointure, je ne vois pas comment l’écrire…

Car comme l’exemple le montre ci-dessus, une formation peut faire partie de plusieurs familles de formations.

A mon avis le problème est sans doute dû à une mauvaise modélisation des données dès le départ ; mais maintenant que le mal est fait, il faut bien que je m’en débrouille…

Merci par avance de vos conseils. Là je coince !!

Avec des jointures?

SQL
[color=blue;font-weight:bold]SELECT[/color] FO.famille_id, FA.id_fam, FA.nom_fam

FROM formation FO
LEFT JOIN FO.famille_id = FA.id_fam

Yep mais le piège c’est qu’il peut y avoir plusieurs famille_id pour un enregistrement dans la table formations (cf l’exemple)… !

Hum, c’est stocké sous quel forme?

(tu pourras certes pas le résoudre en une requête, mais en deux, trois, et ainsi de suite)

Plutôt que de stocker l’ensemble des famille_id dans le même champ, tu devrais faire une table intermédiaire formation_famille qui contient formation_id et famille_id (clé primaire (formation_id, famille_id)), ça serait beaucoup plus simple à gérer ensuite.

Parce que là, il faut que tu fasses une première requête sur formation, qu’en php tu parses le champ “famille_id” pour récupérer tous les numéros (ça se fait très bien en utilisant strtok() notamment), et que tu refasses une requête sur la table famille. Avec une table intermédiaire, une requête avec deux jointures et c’est réglé.

heu je ne pige pas vraiment, que contiendrait précisément la table intermédiaire ?

Juste deux champs : formation_id (référence à la première table), et famille_id (référence à la table des familles), qui forment tous deux la clé primaire.

Pour reprendre ton exemple, ça donnerait ça :


formation_id   famille_id
1              13
1              18
1              21

C’est juste une table pour associer chaque formation avec les familles.
Dans la table formation, tu n’as donc plus besoin du champ “famille_id”.

Ensuite, pour la requête, ça devient :

select fo.module, fo.obj, fa.nom_fam
from formation fo, famille fa, formation_famille fofa
where fo.id = fofa.formation_id
and fofa.famille_id = fa.id_fam
and ...

D’une manière générale, quand dans ton MCD tu as une relation de type n,n, tu passes par une table de ce genre, qui reprend les clés primaires des deux tables.

J’ai pigé. Donc il faut que je fasse un script en PHP qui reprennet tous les famille_id de la table “formation” pour les transférer dans cette table temporaire.
Ca serait quelque chose du genre :

foreach famille_id de formation
insert into table id_formation, famille id

Correct ?

Oui, tout à fait :slight_smile: Tu verras que ça simplifiera nettement tes requêtes SELECT après.

Exactement.

Stocker les listes d’id sous formes de chaîne, say bof :slight_smile: surtout qu’une chaîne, c’est limité en taille.

merci à tous c’était la solution !!