Page 1 sur 2

probleme requete sur les jointures

Posté : 27 juil. 2009, 20:13
par graffx
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
$sql = 'SELECT pseudo,email,date_verif,texte,lect,titre,avatar,localisation FROM forum_general';
$sql.= 'LEFT JOIN connexion ON pseudo = pseudo_pseudo';
$sql.= 'WHERE id="'.mysql_escape_string($id).'"';

En effet, j' ai un probleme sql, et je ne trouve pas l' erreur.

C' est un embetant de tout réexpliquer, mais bon.

J' aimerai joindre les infos en premier de ma table forum_general ( pseudo,email,date_verif,texte,lect,titre) avec celle de ma table connexion qui contient les infos membres (avatar, localisation), et je me retrouve avec une erreur sql.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id="4"' at line 1

Je ne comprned pas cette erreur du tout surtout a l' emplacement donné:
<?php

/*
* - Script    : LightForum
* - Version   : 1.9a
* - Date      : 8 novembre 2005
* Merci de lire le fichier licence.txt / Please read the file licence.txt
*/
// Debut du temps d'execution
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

// inclusion du fichier de config
require('config.inc.php');

// Récupération des variables Get
isset($_GET['id']) ? $id = $_GET['id'] : $id = 0;

// Tags HTML
//echo '<html><head><title>Light Forum de ',$nomsite,'</title></head><body>';
include $install_path . 'design/en-tete.php';



// Verification du mode
if($debug) {
	echo showError('4','');
}

// menu de navigation haut
include $install_path . 'menu-haut.inc.php';

// connexion &agrave; la base de donn&eacute;es
$db = mysql_connect($host, $login, $password) or die(showError('1', mysql_error()));
mysql_select_db($base,$db) or die(showError('2', mysql_error()));

// on r&eacute;cup&egrave;re les infos du message original
$sql = 'SELECT pseudo,email,date_verif,texte,lect,titre,avatar,localisation FROM forum_general';
$sql.= 'LEFT JOIN connexion ON pseudo = pseudo_pseudo';
$sql.= 'WHERE id="'.mysql_escape_string($id).'"';

Re: probleme requete sur les jointures

Posté : 27 juil. 2009, 21:05
par Victor BRITO
Il manque des espaces à la concaténation. ;)
$sql = 'SELECT pseudo,email,date_verif,texte,lect,titre,avatar,localisation FROM forum_general';
$sql.= ' LEFT JOIN connexion ON pseudo = pseudo_pseudo';
$sql.= ' WHERE id="'.mysql_escape_string($id).'"';

Posté : 28 juil. 2009, 10:52
par graffx
mmmmh nom, a mon avis j' ai un souci de structure dans ma requete, mais j' ai du mal la ,je continue mes recherches :?

Posté : 28 juil. 2009, 11:12
par narcisse
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=

Re: probleme requete sur les jointures

Posté : 28 juil. 2009, 12:30
par niuxe
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 ?

++

Posté : 29 juil. 2009, 13:25
par graffx
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 :)

Posté : 29 juil. 2009, 15:26
par niuxe
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.

Posté : 29 juil. 2009, 16:12
par graffx_en_invite
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

Posté : 29 juil. 2009, 16:25
par niuxe
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.

Posté : 29 juil. 2009, 16:52
par narcisse
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.

Posté : 29 juil. 2009, 19:06
par graffx
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 ????

Posté : 29 juil. 2009, 19:28
par niuxe
...
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. ;)

Posté : 29 juil. 2009, 19:33
par graffx
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?

Posté : 30 juil. 2009, 10:22
par narcisse
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à ...

Posté : 30 juil. 2009, 12:59
par niuxe
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.