probleme requete sur les jointures

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 : probleme requete sur les jointures

par niuxe » 31 juil. 2009, 13:31

Laughing je sais je suis mauvais ^^
Je n'ai pas dit ça.
j' avais bien compris le table1.champs1 etc etc mais lorsqu' on code c est jamais si facile
Parfois lire une personne, ce n'est pas évident. Chacun a ses propres méthodes d'écritures plus ou moins justes. ^^

Bonne journée à toi. :)

par graffx » 31 juil. 2009, 12:54

:lol: je sais je suis mauvais ^^

mais je suis en vacances ce soir, j' avais bien compris le table1.champs1 etc etc mais lorsqu' on code c est jamais si facile ^^

par niuxe » 30 juil. 2009, 12:59

Hello,
Pour accéder au champ Truc depuis la base de données

SELECT Tchou.Toto.Truc FROM Tchou.Toto;

En gros, le point te permet de pointer sur un contenu. La base contient une table :
database.table;
C'est ce que j'ai essayé de lui faire comprendre par un moyen plus rapide.

par narcisse » 30 juil. 2009, 10:22

Et enfin, le. et n. je comprned pas comment mysql peut comprendre ca, donc si j' ai une table "zozo", je peux simplement mettre z.champ ????
Tu crées une base de données :
Tchou

Tu crées une table :
Toto

Tu crées un champ :
Truc

Puis un autre champ :
Bidule

Pour accéder au champ Truc depuis la base de données

SELECT Tchou.Toto.Truc FROM Tchou.Toto;

En gros, le point te permet de pointer sur un contenu. La base contient une table :
database.table;

La table contient un champ :
table.champ

C'est très pratique si toutes tes tables ont un champ id :
select table.id, table2.id from ...
tu n'aurais pas pu faire :
select id, id from ...

voilà voilà ...

par graffx » 29 juil. 2009, 19:33

haaaaa je suis trop un boulet :D

eleve_temp AS e NATURAL JOIN notes_francais AS n

Bon, je vais quand meme relire lol j' ai saisi mais j' oublie vite, sinon pour le coté graphique, les bugs?

par niuxe » 29 juil. 2009, 19:28

...
Et enfin, le. et n. je comprned pas comment mysql peut comprendre ca, donc si j' ai une table "zozo", je peux simplement mettre z.champ ????
Pourquoi pas ? Tu peux aussi écire ceci :
j_ecris_nimportequoi.champ = etc.

Si tu ne comprends pas, c'est que tu n'as pas tout lu. Je t'invite à relire et le faire. ;)

par graffx » 29 juil. 2009, 19:06

Je suis tout a fait d' accord la dessus, mais ca n' est pas le site officiel, je dois le rajouter sous le logo.

Je suis en train de developper une communauté parrallèle, j' y crois dur comme fer.


espace membre, forums mais aussi bientot systeme d' annonces, de rencontres, de recherche d' emploi, bref, plein d' idées qui se realiseront du sais-je y passer 1 an :)


Pour les details graphiques, de quoi s' agit il?


Et enfin, le. et n. je comprned pas comment mysql peut comprendre ca, donc si j' ai une table "zozo", je peux simplement mettre z.champ ????

par narcisse » 29 juil. 2009, 16:52

Et sinon pour alsacréation, je connais oui, mais tu dis ca parce que mon site est moche? :D
Puisque tu poses la question, je dirais : pas adapté au site d'une commune / d'un village / d'une ville.

par niuxe » 29 juil. 2009, 16:25

merci mais c' est quoi les e. et n. ?
Regarde les commentaires. ;)
Et sinon pour alsacréation, je connais oui, mais tu dis ca parce que mon site est moche? :D
Bien que je vois quelques erreurs sur le design global, cela reste subjectif. Cependant, je parle de la qualité du code.

par graffx_en_invite » 29 juil. 2009, 16:12

merci mais c' est quoi les e. et n. ?

Et sinon pour alsacréation, je connais oui, mais tu dis ca parce que mon site est moche? :D

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.

par graffx » 29 juil. 2009, 13:25

Merci a tous, c' était bien ce sujet la, le tuto donné dedans est trop cool.


Sinon avec ta correction je me retrouve avec :


Not unique table/alias: 'connexion' :?

Oula je crois que ca devient chaud a comprendre, voila la structure de ms tables forum_general et connexion
CREATE TABLE IF NOT EXISTS `forum_general` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `pseudo` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL default '',
  `date_verif` datetime NOT NULL default '0000-00-00 00:00:00',
  `texte` text NOT NULL,
  `reponse_a_id` int(11) unsigned NOT NULL default '0',
  `addr` varchar(255) NOT NULL default '',
  `lect` mediumint(8) unsigned NOT NULL default '0',
  `titre` varchar(255) NOT NULL default '- pas de titre -',
  `recevoirParMail` tinyint(1) unsigned NOT NULL default '0',
  `derniereReponse` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`),
  KEY `reponse_a_id` (`reponse_a_id`),
  KEY `derniereReponse` (`derniereReponse`),
  KEY `recevoirParMail` (`recevoirParMail`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;




CREATE TABLE IF NOT EXISTS `connexion` (
  `id` int(255) NOT NULL,
  `pseudo` varchar(255) NOT NULL,
  `passe` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `site` varchar(255) NOT NULL,
  `avatar` varchar(255) NOT NULL,
  `localisation` varchar(255) NOT NULL,
  `profession` varchar(255) NOT NULL,
  `biographie` varchar(1000) NOT NULL,
  `signature` varchar(255) NOT NULL,
  `derniere_visite` varchar(11) NOT NULL,
  `rang` int(11) NOT NULL,
  `post` int(11) NOT NULL,
  `inscrit` int(11) NOT NULL,
  `msn` varchar(250) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;




edit:

la bonne requete etait:

$sql = 'SELECT forum_general.pseudo,forum_general.email,date_verif,texte,lect,titre,localisation,connexion.avatar FROM forum_general';
$sql.= ' LEFT OUTER JOIN connexion ON forum_general.pseudo = connexion.pseudo';
$sql.= ' WHERE forum_general.id="'.mysql_escape_string($id).'"';

A premiere vu, alors je fais des essais et je vous tiens au courant, si vous voulez voir ce que ca donne par curiosité http://www.ville-de-bernay.com c' est bien sur en construction mais tout le systeme membre est operationnel, il peut y avoir quelques bugs cependant :)

Re: probleme requete sur les jointures

par niuxe » 28 juil. 2009, 12:30

Bonjour, le message que j' ai mis sur les jointures a disparu? Je ne le trouve pas en cherchant avec mon pseudo :? :? :? :?


J' aurai aimé que la personne qui m' adonné un lien clair sur les jointures me le redonne concernant ma requete...
Hello,

Était ce sujet ?

++

par narcisse » 28 juil. 2009, 11:12

Il faut effectivement faire attention à tes espaces.

Ensuite :

Code : Tout sélectionner

$sql.= ' LEFT JOIN connexion ON pseudo = pseudo_pseudo';
Ca ne veut rien dire. Tu veux faire une jointure sur deux tables, il faut définir les champs de jointure :

$sql.= ' LEFT OUTER JOIN connexion ON pseudo.id = connexion.pseudo_id'

Ou pseudo.id = clé primaire de pseudo
et connexion.pseudo_id = clé étrangère de connexion


Si tu n'as pas ces clés primaires / étrangères, il faut les créer.

C'était ça le message disparu ?
http://www.phpfrance.com/forums/viewtop ... highlight=

par graffx » 28 juil. 2009, 10:52

mmmmh nom, a mon avis j' ai un souci de structure dans ma requete, mais j' ai du mal la ,je continue mes recherches :?