Page 1 sur 1

Probleme de jointure

Posté : 04 oct. 2008, 12:15
par banban55
Bonjour, je bloque depuis quelques jours sur un soucis de jointure qui je pense est trés simple à résoudre.

Je vous explique le but de la manip, J'ai un tableau dans mon pannel admin qui regroupe tous les utilisateurs de mon site( table " devis " ) qui a une jointure avec la ( table " creation" )....

Code : Tout sélectionner

TABLE `creation` ( `id_creation` int(11) NOT NULL auto_increment, `id_user` int(11) unsigned NOT NULL default '0', `etat` varchar(40) NOT NULL default 'en attente', `apercu1` varchar(100) NOT NULL default 'boutonprojetapercu.png', `apercu2` varchar(100) NOT NULL default 'boutonprojetapercu.png', `apercu3` varchar(100) NOT NULL default 'boutonprojetapercu.png', `url` varchar(150) default NULL, `note_admin` text, PRIMARY KEY (`id_creation`), UNIQUE KEY `id_user` (`id_user`) ) TYPE=MyISAM AUTO_INCREMENT=11 ;

Code : Tout sélectionner

TABLE `devis` ( `id` bigint(20) unsigned NOT NULL auto_increment, `niveau` varchar(20) NOT NULL default 'attente', `nom` varchar(30) NOT NULL default '', `prenom` varchar(30) NOT NULL default '', `sexe` varchar(10) NOT NULL default '', `email` varchar(100) NOT NULL default '', `password` varchar(10) NOT NULL default '', `adresse1` varchar(150) NOT NULL default '', `adresse2` varchar(150) default NULL, `ville` varchar(50) NOT NULL default '', `codepost` varchar(10) NOT NULL default '', `date_nai` varchar(20) NOT NULL default '', `date_dem` timestamp NOT NULL, `type` varchar(30) NOT NULL default '', `statu` varchar(30) NOT NULL default '', `titre` varchar(50) NOT NULL default '', `description` longtext NOT NULL, `couleur1` varchar(7) NOT NULL default '', `couleur2` varchar(7) NOT NULL default '', `couleur3` varchar(7) default NULL, `couleur4` varchar(7) default NULL, `image1` varchar(250) default 'imgapercu.png', `image2` varchar(250) default 'imgapercu.png', `image3` varchar(250) default 'imgapercu.png', `image4` varchar(250) default 'imgapercu.png', `supplement` longtext, PRIMARY KEY (`id`), KEY `email` (`email`,`type`), KEY `niveau` (`niveau`) ) TYPE=MyISAM AUTO_INCREMENT=21 ;
Explication: Quand j'affiche les utilisateurs dans le tableau, certains auront un champ de créer dans la table (creation) et d'autre non.

Mon probleme,

Quand j'affiche mon teableau j'ai uniquement les enregistrements de la table creation qui s'affiche.

Voici ma requete

Code : Tout sélectionner

"SELECT devis.id, devis.nom, devis.sexe, devis.type, devis.titre, creation.id_user FROM devis, creation WHERE devis.id=creation.id_user"
Avez-vous une idée du probleme, qui est sans aucun doute un probleme de requete ?

Posté : 04 oct. 2008, 13:53
par albat
Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".

Merci de prendre le temps de lire les règlements
ainsi que l'intitulé de chaque forum avant de poster un nouveau sujet.

Posté : 04 oct. 2008, 15:13
par Patriboom
Il te faudrait réviser le chapitre sur les jointures de tables de MySQL. Voici quelques éléments:

Pour joindre deux ou plusieurs tables, il est utile (dès que deux champs portent le même nom, mais d'en prendre l'habitude même autrement n'est pas bête) de donner des allias aux tables. Ainsi, tu auras:
SELECT blablabla FROM devis AS devis
Tu ne peux appeler que la table principale dans le FROM. L'autre doit ètre appelée par un JOIN. Dans ton cas, le WHERE tient lieu de JOIN et c'est là l'erreur. La fonction WHERE sélectionnera les entrées parmi toutes les entrées combinées par le ou les JOIN. Ainsi, tu auras:
JOIN creation AS creation ON devis.id=creation.id_user
à cela, tu pourras aujouter des critères de recherches qui ne garderont que les éléments correspondants à de contenu venant de devis aussi bien que de creation


Donc: SELECT ... FROM table1 AS allias1 JOIN table2 AS allias2 ON jointure WHERE critere ORDER BY tri


Une bonne lecture de http://dev.mysql.com/doc/refman/5.0/fr/index.html t'aidera davantage.

Posté : 04 oct. 2008, 15:46
par banban55
merci pour ta réponse,

Je viens de faire un essai avec JOIN

apercu de la requete:

Code : Tout sélectionner

SELECT devis.id, devis.nom, devis.sexe, devis.type, devis.titre, creation.id_user FROM devis JOIN creation ON devis.id=creation.id_user ORDER BY devis.id
Maintenant, il m'affiche uniquement les enregistrements de la table " creation "soit 2 enregistements jointe à la table " devis ", normalement je devrais avoir un tableau qui affiche 4 enregistements ( de la table devis ) et ( de la table creation (qui correspondent au meme id_user que le id de la table devis))

pas facile à expliquer :cry:

Posté : 05 oct. 2008, 03:40
par Patriboom
Essaie avec LEFT JOIN

et vérifie si la jointure se fait bien dans le sens que tu le désires.

http://dev.mysql.com/doc/refman/5.0/fr/ ... ation.html

Posté : 05 oct. 2008, 19:20
par banban55
Merci pour votre aide, ma requete fonctionne avec

Code : Tout sélectionner

SELECT devis . *, creation . * FROM creation RIGHT JOIN devis ON devis.id=creation.id_user

Posté : 05 oct. 2008, 21:32
par Patriboom
Alors ... il ne vous reste qu'à mettre "Résolu" à votre message.