Probleme de jointure sur plus de deux tables

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 de jointure sur plus de deux tables

par furiouslol » 16 oct. 2008, 06:06

Ok merci netsupra c'est tres clair comme ca :)

par netsupra » 16 oct. 2008, 00:40

Une page qui résume assez bien la situation ;)
http://www.oscommerce-fr.info/faq/qa_info.php?qID=198
Netsupra

par furiouslol » 15 oct. 2008, 22:25

Ha ouééé ca m'interesse ca !! J'ai eu plusieurs problemes a ce sujet denierement que j'ai reglé en écrivant systematiquement mes requetes avec une seule table dans le FROM, les autres etant en JOIN, meme si c'etait une jointure simple que je faisait

exemple, cette requete marche tout le temps

Code : Tout sélectionner

SELECT * FROM a JOIN b LEFT JOIN c
Alors que celle ci peut coincer

Code : Tout sélectionner

SELECT * FROM a, b LEFT JOIN c
Quelqu'un pourrait il développer le probleme ? Effectivement parfois changer l'ordre des tables dans le FROM peu marcher mais pas toujours

par Cyrano » 15 oct. 2008, 22:22

Simplement logique : le JOIN va se faire sur la dernière table ciblée.

par netsupra » 15 oct. 2008, 21:31

C'est bon, ca marche, mais je ne savais pas qu'il y avait un ordre dans la clause FROM ?

Netsupra

par Cyrano » 15 oct. 2008, 18:38

Vu, ma faute, inverse topics et categories dans la clause FROM et refais l'essai

par netsupra » 15 oct. 2008, 15:00

Non, c'est moi qui mets les accents "dans tous les sens" :), meme si ca aide pas a la lecture, ca fait des requetes plus propres, enfin, de mon point de vue, comme ca, on repere facilement ce qui est des données, ou autres choses. Mais il est vrai que ca rend assez mal sur le forum a cause de l'indentation qui change

Sinon, maintenant que j'ai corrigé, vla aut'chose :D

Code : Tout sélectionner

sprintf('SELECT `linked_topics`.`linked_topic`, ' . '`topics`.`title` as topic_title, ' . '`categories`.`title` as category_title ' . 'FROM `topics`, `categories` ' . 'INNER JOIN `linked_topics` ON `topics`.`topic_id` = `linked_topics`.`linked_topic` ' . 'WHERE `linked_topics`.`topic_id` = %d', mysql_real_escape_string($_GET['topic']));
me renvoie l'erreur :
Unknown column 'topics.topic_id' in 'on clause'.

Pourtant, cette colonne existe bien (j'ai tenté plusieurs combinaisons dans le ON, a chaque fois il me dit qu'une colonne n'existe pas)...
Netsupra

par Berzemus » 15 oct. 2008, 14:32

Le join m'a l'air mal fait, on fait un join par table, pas plusieurs tables par join.

Ceci dit, c'est ton IDE qui structure la requête ainsi, avec des jolis apostrophes et accents renversés partout dans tout les sens ? Ca aide vachement à la lecture en tout cas.. :boire4:

par Cyrano » 15 oct. 2008, 14:29

Oui : dans ta condition de jointure, tu ne peux pas indiquer les deux tables de cette manière, corrigé :

Code : Tout sélectionner

SELECT `linked_topics`.`linked_topic`, `topics`.`topic_id`, `topics`.`title`, `categories`.`title` FROM `linked_topics` , `topics` INNER JOIN `categories` ON `topics`.`category_id` = `categories`.`category_id` WHERE `linked_topics`.`topic_id` = 1

Probleme de jointure sur plus de deux tables

par netsupra » 15 oct. 2008, 14:13

Bonjour,
cette requete :

Code : Tout sélectionner

$sql_query = sprintf('SELECT `linked_topics`.`linked_topic`, ' . '`topics`.`topic_id`, ' . '`topics`.`title`, ' . '`categories`.`title` ' . 'FROM `linked_topics` ' . 'INNER JOIN `topics`, `categories` ON `topics`.`category_id` = `categories`.`category_id` ' . 'WHERE `linked_topics`.`topic_id` = %d', mysql_real_escape_string($_GET['topic']));
Me renvoie une erreur au niveau du JOIN (je pense que cela provient du fait que je joint deux tables.
Je pose la question, non pas secifiquement pour ce probleme, mais dans le cadre general d'une jointure qui se base sur trois tables ou plus
Avez vous une idée ?
Merci,
netsupra[/php]