par
niuxe » 29 juil. 2009, 15:26
Hello,
Je vais répondre à ta question d'une manière détournée afin que tu comprennes mieux le principe d'une jointure et comment faire.
* Bien qu'une bdd avec cette architecture ne soit pas tout à fait bonne d'un point de vu conceptuel, je te propose de créer ses deux tables ci-dessous avec leurs insertions respectives :
CREATE TABLE `eleve_temp` (
`id_eleve` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nom` VARCHAR(64) NOT NULL,
`prenom` VARCHAR(64) NOT NULL,
`adresse` text NOT NULL,
`cp` VARCHAR(5) NOT NULL,
`ville` text NOT NULL
);
INSERT INTO `eleve_temp` (`id_eleve`, `nom`, `prenom`, `adresse`, `cp`, `ville`) VALUES
(1, 'LePère', 'Joseph', 'Rue de la Liberté', '06400', 'Nice'),
(2, 'Dupont', 'jean', '84, rue du Paradis', '06210', 'Mandelieu'),
(3, 'Bertrand', 'Céline', '25, bd de Loraine', '06600', 'Pégomas'),
(4, 'Aranjuez', 'Juanita', '78, rue Jean Jaures', '62200', 'Juan Les Pins'),
(5, 'Durant', 'Robert', '45, av Shuman', '56500', 'Nancy'),
(6, 'Leroy', 'Jocelyne', '3, place Coluche', '75014', 'Paris');
CREATE TABLE notes_francais(
id_notes_francais INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
note TINYINT (2) NOT NULL,
id_eleve INT NOT NULL,
FOREIGN KEY(id_eleve) REFERENCES eleve_temp(id_eleve)
);
/*
Nous aurions pu écrire ceci qui est nettement plus sympathique :
CREATE TABLE notes_francais(
id_notes_francais INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
note TINYINT (2) NOT NULL,
id_eleve INT NOT NULL,
CONSTRAINT fk_id_eleve_pk_eleve_temp_id_eleve
FOREIGN KEY(id_eleve) REFERENCES eleve_temp(id_eleve) ON DELETE CASCADE ON UPDATE CASCADE
);
*/
INSERT INTO notes_francais (id_notes_francais, note,id_eleve) VALUES
(1,10,5),
(2,15,6),
(3,14,3),
(4,13,1),
(5,5,4),
(6,9,2);
En regardant attentivement l'architecture des deux tables, tu vois le champ id_eleve à deux reprises :
1 clef primaire à eleve_temp (primary key)
2 clef étrangère à notes_francais (foreign key)
C'est ce qui permet de faire des jointures. Regarde bien les deux « query » suivantes :
//pas obliger de passer par php pour exécuter la requête. il y a un éditeur dans phpmyadmin
// Quelle note à Joceline ?
$sql = "SELECT e.prenom, e.nom, n.note ";
$sql .= "FROM eleve_temp AS e NATURAL JOIN notes_francais AS n ";
$sql .= "WHERE e.nom = 'Leroy'";
// « l'argument » AS (comme) est ce que l'on appelle un Alias en SQL
// traduction (from...) : DE la table eleve_temp = e Jointure naturelle notes_francais = n
//Qui a une note au dessus de la moyenne ?
$sql = "SELECT e.prenom, e.nom, n.note ";
$sql .= "FROM eleve_temp AS e, notes_francais AS n ";
$sql .= "WHERE e.id_eleve = n.id_eleve ";
$sql .= "AND n.note >= 10";
Si tu as des questions, n'hésite pas.
Bonne journée à toi.
ps : J'ai parcouru vite fait ton site en chantier. Attention à l'orthographe. Je peux également te conseiller de parcourir sans modération
Alsacreations.
Hello,
Je vais répondre à ta question d'une manière détournée afin que tu comprennes mieux le principe d'une jointure et comment faire.
* Bien qu'une bdd avec cette architecture ne soit pas tout à fait bonne d'un point de vu conceptuel, je te propose de créer ses deux tables ci-dessous avec leurs insertions respectives :
[php]
CREATE TABLE `eleve_temp` (
`id_eleve` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nom` VARCHAR(64) NOT NULL,
`prenom` VARCHAR(64) NOT NULL,
`adresse` text NOT NULL,
`cp` VARCHAR(5) NOT NULL,
`ville` text NOT NULL
);
INSERT INTO `eleve_temp` (`id_eleve`, `nom`, `prenom`, `adresse`, `cp`, `ville`) VALUES
(1, 'LePère', 'Joseph', 'Rue de la Liberté', '06400', 'Nice'),
(2, 'Dupont', 'jean', '84, rue du Paradis', '06210', 'Mandelieu'),
(3, 'Bertrand', 'Céline', '25, bd de Loraine', '06600', 'Pégomas'),
(4, 'Aranjuez', 'Juanita', '78, rue Jean Jaures', '62200', 'Juan Les Pins'),
(5, 'Durant', 'Robert', '45, av Shuman', '56500', 'Nancy'),
(6, 'Leroy', 'Jocelyne', '3, place Coluche', '75014', 'Paris');
CREATE TABLE notes_francais(
id_notes_francais INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
note TINYINT (2) NOT NULL,
id_eleve INT NOT NULL,
FOREIGN KEY(id_eleve) REFERENCES eleve_temp(id_eleve)
);
/*
Nous aurions pu écrire ceci qui est nettement plus sympathique :
CREATE TABLE notes_francais(
id_notes_francais INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
note TINYINT (2) NOT NULL,
id_eleve INT NOT NULL,
CONSTRAINT fk_id_eleve_pk_eleve_temp_id_eleve
FOREIGN KEY(id_eleve) REFERENCES eleve_temp(id_eleve) ON DELETE CASCADE ON UPDATE CASCADE
);
*/
INSERT INTO notes_francais (id_notes_francais, note,id_eleve) VALUES
(1,10,5),
(2,15,6),
(3,14,3),
(4,13,1),
(5,5,4),
(6,9,2);
[/php]
En regardant attentivement l'architecture des deux tables, tu vois le champ id_eleve à deux reprises :
1 clef primaire à eleve_temp (primary key)
2 clef étrangère à notes_francais (foreign key)
C'est ce qui permet de faire des jointures. Regarde bien les deux « query » suivantes :
[php]
//pas obliger de passer par php pour exécuter la requête. il y a un éditeur dans phpmyadmin
// Quelle note à Joceline ?
$sql = "SELECT e.prenom, e.nom, n.note ";
$sql .= "FROM eleve_temp AS e NATURAL JOIN notes_francais AS n ";
$sql .= "WHERE e.nom = 'Leroy'";
// « l'argument » AS (comme) est ce que l'on appelle un Alias en SQL
// traduction (from...) : DE la table eleve_temp = e Jointure naturelle notes_francais = n
//Qui a une note au dessus de la moyenne ?
$sql = "SELECT e.prenom, e.nom, n.note ";
$sql .= "FROM eleve_temp AS e, notes_francais AS n ";
$sql .= "WHERE e.id_eleve = n.id_eleve ";
$sql .= "AND n.note >= 10";
[/php]
Si tu as des questions, n'hésite pas.
Bonne journée à toi. :)
ps : J'ai parcouru vite fait ton site en chantier. Attention à l'orthographe. Je peux également te conseiller de parcourir sans modération [url=http://www.alsacreations.com]Alsacreations[/url].