Probleme de jointure sur plus de deux tables

Eléphant du PHP | 187 Messages

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]

Mammouth du PHP | 19672 Messages

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4039 Messages

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:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 187 Messages

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

Mammouth du PHP | 19672 Messages

15 oct. 2008, 18:38

Vu, ma faute, inverse topics et categories dans la clause FROM et refais l'essai
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 187 Messages

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

Mammouth du PHP | 19672 Messages

15 oct. 2008, 22:22

Simplement logique : le JOIN va se faire sur la dernière table ciblée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 254 Messages

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

Eléphant du PHP | 187 Messages

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

Eléphant du PHP | 254 Messages

16 oct. 2008, 06:06

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