[MySQL 5.0.51 (Free.fr)]Jointure sur trois tables
Posté : 24 janv. 2008, 21:20
Bonsoir,
Je cherche à afficher un tableau croisé qui contiendrait des infos stockées dans trois tables différentes et je cale sur la requête à formuler.
Il s'agit d'afficher les votes de députés concernant un certain nombre de lois.
J'ai un première table intitulé "deputes" dont voici la structure :
J'ai aussi une seconde table, nommée "lois" qui contient toutes les infos sur les lois :
J'ai enfin une dernière table "votes" qui récupère les IDs des députés et des lois enregistrés au préalable et qui stocke les différents votes :
Je cherche à afficher un tableau croisé qui afficherait le vote de chaque député concernant chaque loi, avec en ligne les noms des députés et en colonne les intitulés des lois. J'ai fait un petit schéma pour être plus clair : http://leo.dumont.free.fr/schema.html
Mon problème est de trouver une requête qui demanderait au serveur d'afficher dans chaque cellule le vote du député de la ligne concernant la loi de la colonne. Par exemple pour la cellule colorée en rouge, il faudrait que se soit le vote du député 1 concernant la loi 1 et ainsi de suite pour chaque cellule.
Mais je ne sais pas comment m'y prendre. J'ai tenté de faire plusieurs requêtes différentes, mais ça ne fonctionne pas :
Je me doute qu'il faut utiliser une jointure, mais je connais mal cet aspect du SQL, c'est pouquoi je me tourne vers vous.
En farfouillant un peu sur le web je suis arrivé à faire la requête suivante, mais ça ne me donne toujours pas ce que je veux :
Merci d'avance.
Je cherche à afficher un tableau croisé qui contiendrait des infos stockées dans trois tables différentes et je cale sur la requête à formuler.
Il s'agit d'afficher les votes de députés concernant un certain nombre de lois.
J'ai un première table intitulé "deputes" dont voici la structure :
Code : Tout sélectionner
CREATE TABLE IF NOT EXISTS `deputes` (
`id` int(150) NOT NULL auto_increment COMMENT 'ID député sur lequel est greffée la clef primaire de la table.',
`nom` varchar(150) collate latin1_general_ci NOT NULL COMMENT 'Nom du député.',
`prenom` varchar(150) collate latin1_general_ci default NULL COMMENT 'Prénom du député.',
`nbr_suff` int(240) NOT NULL COMMENT 'Nombre de suffrages totalisés par le député lors de son élection',
`clivage` varchar(100) collate latin1_general_ci default NULL COMMENT 'Orientation politique du député, ce champ relève du codage.',
`membre_gvt_prov` tinyint(1) NOT NULL COMMENT 'Le député était-il membre du gouvernement provisoir ?',
`elu_prec` tinyint(1) NOT NULL COMMENT 'Le député avait-il été élu avant 1848 ?',
`election` varchar(50) collate latin1_general_ci NOT NULL COMMENT 'Trois sessions d''élections en avril, en juin et en septembre',
`date_naissance` date default NULL COMMENT 'Date de naissance.',
`date_mort` date default NULL COMMENT 'Date de mort.',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='Table contenant les 34 députés de la Seine cités dans la source' AUTO_INCREMENT=37 ;
Code : Tout sélectionner
CREATE TABLE IF NOT EXISTS `lois` (
`id` int(150) NOT NULL auto_increment COMMENT 'ID loi sur lequel est greffée la clef primaire de la table.',
`intitule` varchar(240) collate latin1_general_ci NOT NULL COMMENT 'Intitulé de la loi.',
`voix_pr` int(255) default NULL COMMENT 'Nombre de voix pour la loi.',
`voix_ct` int(255) default NULL COMMENT 'Nombre de voix contre la loi.',
`date_loi` date default NULL COMMENT 'Date du vote de la loi.',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='Table contenant les 35 lois citées par la source.' AUTO_INCREMENT=34 ;
Code : Tout sélectionner
CREATE TABLE IF NOT EXISTS `votes` (
`id` int(150) NOT NULL auto_increment COMMENT 'ID du vote ; il y a un vote par loi et par député.',
`id_dep` int(150) NOT NULL COMMENT 'ID du député afin de lui rattacher son vote.',
`id_loi` int(150) NOT NULL COMMENT 'ID de la loi concerné par le vote dont il est question.',
`vote` int(1) NOT NULL COMMENT 'Le député a t-il voté pour la loi ?',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='Table contenant les votes de chaque député concernant chaque' AUTO_INCREMENT=1121 ;
Mon problème est de trouver une requête qui demanderait au serveur d'afficher dans chaque cellule le vote du député de la ligne concernant la loi de la colonne. Par exemple pour la cellule colorée en rouge, il faudrait que se soit le vote du député 1 concernant la loi 1 et ainsi de suite pour chaque cellule.
Mais je ne sais pas comment m'y prendre. J'ai tenté de faire plusieurs requêtes différentes, mais ça ne fonctionne pas :
Code : Tout sélectionner
$req_votes = mysql_query("SELECT intitule FROM lois");
while ($data_votes = mysql_fetch_array($req_votes))
{
echo '<td>'.$data_votes['intitule'].'</td>';
}
echo'</tr>';
$req_votes2 = mysql_query("SELECT nom FROM deputes");
while ($data_votes2 = mysql_fetch_array($req_votes2))
{
echo'<tr>
<td>'.$data_votes2['nom'].'</td>';
$req_votes3 = mysql_query("SELECT vote FROM votes");
while ($data_votes3 = mysql_fetch_array($req_votes3))
{
echo'<td>'.$data_votes3['vote'].'</td>';
}
echo'</tr>';
}
En farfouillant un peu sur le web je suis arrivé à faire la requête suivante, mais ça ne me donne toujours pas ce que je veux :
Code : Tout sélectionner
SELECT * FROM votes INNER JOIN lois ON votes.id_loi=lois.id INNER JOIN deputes ON votes.id_dep:deputes.id