Page 1 sur 1

Probleme de jointure sur plus de deux tables

Posté : 15 oct. 2008, 14:13
par netsupra
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]

Posté : 15 oct. 2008, 14:29
par Cyrano
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

Posté : 15 oct. 2008, 14:32
par Berzemus
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:

Posté : 15 oct. 2008, 15:00
par netsupra
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

Posté : 15 oct. 2008, 18:38
par Cyrano
Vu, ma faute, inverse topics et categories dans la clause FROM et refais l'essai

Posté : 15 oct. 2008, 21:31
par netsupra
C'est bon, ca marche, mais je ne savais pas qu'il y avait un ordre dans la clause FROM ?

Netsupra

Posté : 15 oct. 2008, 22:22
par Cyrano
Simplement logique : le JOIN va se faire sur la dernière table ciblée.

Posté : 15 oct. 2008, 22:25
par furiouslol
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

Posté : 16 oct. 2008, 00:40
par netsupra
Une page qui résume assez bien la situation ;)
http://www.oscommerce-fr.info/faq/qa_info.php?qID=198
Netsupra

Posté : 16 oct. 2008, 06:06
par furiouslol
Ok merci netsupra c'est tres clair comme ca :)