jointure a realiser

Eléphant du PHP | 72 Messages

15 juil. 2008, 09:20

Bonsoir ,
Comme je galere depuis deja un peu de temps je vous presente mon probleme.
en esperant avoir des suggestions de reglages .

j'ai deux tables automobile et options
automobile contient les caracteristiques de l'auto
et options les differentes options de celle-ci.

les options de recherche sont mise dans un tableaux de cette maniere

Code : Tout sélectionner

$where = array(); if ($accident) { // si le champ 1 est renseigné $where[] = " accident='$accident' "; } $where[] = " annee BETWEEN '$annee_debut' AND '$annee_fin' "; etc...............
voila ma requete :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `automobile` ( `id` mediumint(5) NOT NULL auto_increment, `id_membre` mediumint(5) NOT NULL, `marque` varchar(2) collate latin1_general_ci NOT NULL, `modele` varchar(3) collate latin1_general_ci NOT NULL, `mois` varchar(2) collate latin1_general_ci NOT NULL, `annee` varchar(4) collate latin1_general_ci NOT NULL, `prix` varchar(5) collate latin1_general_ci NOT NULL, `accident` varchar(1) collate latin1_general_ci NOT NULL, `carburant` varchar(1) collate latin1_general_ci NOT NULL, `kilometrage` varchar(5) collate latin1_general_ci NOT NULL, `chevaux` varchar(2) collate latin1_general_ci NOT NULL, `vehicule_etat` varchar(1) collate latin1_general_ci NOT NULL, `transmission` varchar(1) collate latin1_general_ci NOT NULL, `cylindre` varchar(1) collate latin1_general_ci NOT NULL, `couleur_inter` varchar(1) collate latin1_general_ci NOT NULL, `type_carro` varchar(1) collate latin1_general_ci NOT NULL, `couleur_carro` varchar(1) collate latin1_general_ci NOT NULL, `pays` varchar(1) collate latin1_general_ci NOT NULL, `cp` varchar(5) collate latin1_general_ci NOT NULL, `description` varchar(200) collate latin1_general_ci NOT NULL, `site` varchar(100) collate latin1_general_ci NOT NULL, `date` varchar(11) collate latin1_general_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ; -- -- Contenu de la table `automobile` -- INSERT INTO `automobile` (`id`, `id_membre`, `marque`, `modele`, `mois`, `annee`, `prix`, `accident`, `carburant`, `kilometrage`, `chevaux`, `vehicule_etat`, `transmission`, `cylindre`, `couleur_inter`, `type_carro`, `couleur_carro`, `pays`, `cp`, `description`, `site`, `date`) VALUES (1, 1, '69', '976', '7', '1990', '1000', '2', '3', '10000', '12', '1', '1', '1', '2', '2', '5', '1', '75', 'super 190', 'http://www.nebilpro.free.fr', '1215880255'), (2, 1, '69', '993', '1', '2007', '1000', '2', '2', '10000', '1', '1', '1', '9', '1', '7', '2', '1', '93', 'ignez-vous aux millions d''utilisateurs qui ont déjà intégré la famille eBay. Ce sera un plaisir de vous accueillir parmi nous.\r\n\r\nInscrivez-vous sur eBay pour pouvoir bénéficier des différents avantag', 'http://', '1215881645');

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `options` ( `id` mediumint(5) NOT NULL auto_increment, `id_auto` varchar(2) collate latin1_general_ci NOT NULL, `option` varchar(5) collate latin1_general_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=32 ; -- -- Contenu de la table `options` -- INSERT INTO `options` (`id`, `id_auto`, `option`) VALUES (1, '1', '6'), (2, '1', '15'), (3, '1', '18'), (4, '1', '21'), (5, '1', '24'), (6, '1', '28'), (7, '1', '31'), (8, '1', '35'), (9, '1', '37'), (10, '1', '38'), (11, '1', '39'), (12, '1', '40'), (13, '1', '42'), (14, '1', '43'), (15, '2', '8'), (16, '2', '11'), (17, '2', '15'), (18, '2', '16'), (19, '2', '17'), (20, '2', '18'), (21, '2', '24'), (22, '2', '25'), (23, '2', '29'), (24, '2', '30'), (25, '2', '33'), (26, '2', '37'), (27, '2', '38'), (28, '2', '39'), (29, '2', '40'), (30, '2', '42'), (31, '2', '44');
merci d'avance pour vos renseignements et explication car je suis loin d'etre un expert .
@++

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juil. 2008, 11:52

Bonjour,

il manque la question

Eléphant du PHP | 72 Messages

15 juil. 2008, 12:35

bonjour
il me faut une jointure
car mes conditions de recherche s'effectue sur les elements contenue dans deux tables


mes conditions de recherche s'effectuent sous forme d'un tableaux
$where[] puis je fait un implode de $where[]
il me faut maintenant faire la jointure avec la table OPTIONS

pour faire la recherche des (option)

Code : Tout sélectionner

if ($modele) { // si le champ 1 est renseigné $where[] = " modele='$modele' "; // on l'ajoute a la requete } if ($accident) { // si le champ 1 est renseigné $where[] = " accident='$accident' "; // on l'ajoute a la requete } $where[]

Code : Tout sélectionner

$recherche_auto=mysql_query ("SELECT * FROM automobile where marque='$marque' and ".implode("AND",$where));

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juil. 2008, 13:53

Avant d'essayer de construire la requête par PHP, est-ce que tu as déjà un modèle de ta requête en SQL normal, avec des options en exemple ?

Eléphant du PHP | 72 Messages

15 juil. 2008, 14:22

non!!!
@++

Eléphant du PHP | 139 Messages

15 juil. 2008, 14:25

je pense que ça insinuait :
Essais déjà de faire la requete correcte à la main, et ensuite, une fois que ca fonctionnera, rends la dynamique par PHP :)

Quand on a un soucis : toujours commencer par la réduire à sa forme la plus simple, et ré implémenter le reste après ...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juil. 2008, 14:49

Oui, c'est exactement ça :) : http://www.phpfrance.com/forums/voir_sujet-19378.php
:idea: Au passage, une bonne habitude est de créer un modèle de requête qui marche puis d'insérer ce code SQL dans le script PHP pour le rendre dynamique. Autant ne pas multiplier les risques d'erreur en testant à la fois le PHP et le SQL.
Est-ce que tu sais déjà simplement relier la table "automobiles" à la table "options" sans se préoccuper des options elles-mêmes ?

Eléphant du PHP | 72 Messages

15 juil. 2008, 15:03

non je ne sais pas relier les tables
enfin j'ai une vague idée , mais mon probleme c'est que je n'arrive pas a comprendre tout les termes technique du coup parfois meme les tuto m'aide pas beaucoup
je crois comprendre
que cela peut ce faire de cette maniere

select * automobile join options where (......)
ou
select *automobile where (........) join option where (.....)
Modifié en dernier par nebil le 15 juil. 2008, 15:13, modifié 1 fois.
@++

Eléphant du PHP | 139 Messages

15 juil. 2008, 15:10

Il fallait commencer par là :)

Pour réaliser une jointure, de base, il suffit d'introduire dans ta requete une condition dite "de jointure" reliant les champs des deux tables ayant un rapport. Dans ton cas, le champ id de la table automobiles et le champ id_auto de la table options

Le code est :

Code : Tout sélectionner

SELECT [...] FROM automobile as a, options as o WHERE a.id=o.auto_id
Il te suffit ensuite d'y insérer le reste de tes conditions.

PS : je suis sûr qu'avec un minimum de recherche dans le forum ou sur google, tu aurais trouvé la solution sans soucis :)

Eléphant du PHP | 377 Messages

16 juil. 2008, 11:26

hm, si je peux me permettre...
NON
on ne fait pas de jointure sur une clause WHERE! scrogneugneu
une jointure c'est

Code : Tout sélectionner

SELECT ... FROM table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.champ1 = t2.champ2) WHERE ...
Vous me copierez 100 fois "je ne ferai plus de jointure sur une clause WHERE"
non mais oh :evil:
Petit scarabée deviendra grand

Eléphant du PHP | 422 Messages

16 juil. 2008, 19:30

C'est quoi ces opinions à l'emporte pièce ?
Bien sûr que si, on fait des jointures dans les clauses where : il suffit de prendre n'importe quel cours SQL pour s'en rendre compte : le produit cartésien est d'ailleurs l'une des bases fondamentales de SQL.

Il n'y a effectivement que si des éléments de la table jointe peuvent ne pas exister que l'on utilise la syntaxe LEFT JOIN, ce qui dans l'exemple présent est probablement le cas;

ViPHP
ViPHP | 5924 Messages

16 juil. 2008, 19:47

En fait il est préférable de faire les jointures par JOIN pour aider le SGBD à optimiser la requète…

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 juil. 2008, 20:22

Je suis d'accord avec caroube et Sekiltoyai.

Non seulement, il ne faut pas avancer des éléments si on est pas sûr de ça. Car, effectivement, ce n'est pas forcément une mauvaise pratique de développement.
Mais, comme le souligne Sekiltoyai, dans le cas de MySQL, le JOIN est un bon moyen de controler l'exécution des requêtes ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
AB
ViPHP | 5818 Messages

16 juil. 2008, 22:51

En fait il est préférable de faire les jointures par JOIN pour aider le SGBD à optimiser la requète…
Oui c'est le même argument qu'on peut lire sur developper.com ou ailleurs (sur le manuel mysql par exemple). La clause WHERE pour faire des jointures n'est plus recommandée pour les SGBD actuels car moins performante que JOIN.

Maintenant d'accord avec Zeus et Caroube pour ne pas avancer des opinions à l'emporte pièce, mais dans ce cas, il semble qu'il faille préférer le JOIN si l'on se réfère à la doc :)

ViPHP
ViPHP | 5924 Messages

17 juil. 2008, 01:23

Le seul truc qui me gène c'est que les optimisations basiques sont mal documentées. Et on a tout de même du mal à voir à quel point un JOIN ON sera plus intéressant qu'un FROM WHERE…