Page 1 sur 1

Résolu - SELECT sur liaison entre des tables

Posté : 15 avr. 2009, 02:53
par Peyothe
Bonjour,

Je débute en SQL et je bloque un peu sur mon projet en cours.
Je construis un espace d'administration ou je peux enregistrer des secteurs d'activité et des métiers.
Chaque métier peux être dans plusieurs secteurs d'activité et chaque secteur d'activité comporte plusieurs métiers (très logique normalement)

Mes tables sont construites comme cela :
Table activites
ID_activite
NOM_activite

Code : Tout sélectionner

CREATE TABLE `activites` ( `id_activite` int(10) unsigned NOT NULL auto_increment, `nom_activite` varchar(255) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id_activite`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Table metiers
ID_metier
NOM_metier

Code : Tout sélectionner

CREATE TABLE `metiers` ( `id_metier` int(10) unsigned NOT NULL auto_increment, `nom_metier` varchar(255) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id_metier`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1
Table de relations
ID_relation
ID_activite
ID_metier

Code : Tout sélectionner

CREATE TABLE `rel_activites_metiers` ( `id_activite_metier` int(10) unsigned NOT NULL auto_increment, `id_activite` int(10) unsigned NOT NULL, `id_metier` int(10) unsigned NOT NULL, PRIMARY KEY (`id_activite_metier`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Tous mes enregistrements fonctionnent correctement, mais j'ai un problème lors de l'affichage.
Je ne comprends pas la logique de cette requete car je souhaiterai afficher mes résultats de cette façon :

Nom de l'activité
--Métier dans cette activité
--Métier dans cette activité
--Métier dans cette activité
Nom de l'activité
--Métier dans cette activité
--Métier dans cette activité
Nom de l'activité
--Métier dans cette activité

Voici mon code PHP entourant la requette pour une meilleure compréhension :

Code : Tout sélectionner

$req_activite = "SELECT * FROM activites"; $res_activite = mysql_query($req_activite) or die(mysql_error()); while($row_activite = mysql_fetch_array($res_activite)) { echo ("<h3>".$row_activite['nom_activite']."</h3>"); $req_metier = "_________?????_________"; $res_metier = mysql_query($req_metier) or die(mysql_error()); while($row_metier = mysql_fetch_array($res_metier)) { echo ("<p>".$row_metier['nom_metier']."</p>"); } }
En espérant avoir été le plus clair possible.
Merci par avance de me mettre sur la piste.
Je travail avec MySQL 5.0.51b[/b]

Posté : 15 avr. 2009, 22:48
par furiouslol
Salut

Tu veux savoir quelle requête mettre ? Il te faut utiliser les jointures entre métier et relation, un truc du genre :
SELECT *
FROM relation r
JOIN metier m ON m.id_metier=r.id_activite
WHERE r.id_activite="id_activité trouvé dans la première boucle"
(faut mettre les bons noms de tables et de champs évidement)

Ainsi pour chaque id_activité de ta première requête, tu vas lister toutes les lignes correspondante dans ta table relation, tu vas donc trouver tous les id_metier correspondant. La jointure te sers a récupérer les détails de chaque id_metier dans la table métier

Y a un très bon tuto sur ce forum a propos des jointures, mais sinon pour aller plus loin, personnellement j'aurais fait une seule requête en joignant les trois table, puis j'aurais exploité le résultat dans un seul while, avec un if dedans, de façon a avoir un seul accès a la base et un seul while

Posté : 16 avr. 2009, 00:55
par Peyothe
Merci bcp furiouslol !!

Ton aide m'a été très précieuse.

Et je sais maintenant que ce sont des liaisons :)

A bientôt pour de nouvelles aventures !! Je suis encore au début du projet :twisted: