Différence left join entre mysql 4 et 5

Eléphant du PHP | 441 Messages

22 nov. 2006, 17:57

bonsoir,
j'ai un gros problème (au sens où le temps est compté ...)
J'ai une requête qui fonctionne sans problème sous mysql 4.1.9 mais qui ne passe pas du tout sous mysql 5.0.24:

Le requête :

Code : Tout sélectionner

SELECT child.noeud_id as noeud_id_c, child.noeud_titre as noeud_titre_c, service_chemin, service_noeud_rel_param, service_noeud_rel_value FROM noeud parent, noeud child, noeud_rel left join service_noeud_rel on service_noeud_rel_noeud = child.noeud_id left join service on service_noeud_rel_service=service_id WHERE parent.noeud_id=2 and noeud_rel_parent=parent.noeud_id and noeud_rel_child=child.noeud_id AND child.noeud_type_id = 2 and child.noeud_statut=2 AND parent.noeud_lang_id=1 AND child.noeud_lang_id=1 ORDER BY noeud_rel.noeud_rel_rang, child.noeud_id
Erreur sous la v5:

Code : Tout sélectionner

#1054 - Unknown column 'child.noeud_id' in 'on clause'
Je ne comprend pas du tout car cette colonne est bien définie...
j'ai vraiment besoin de votre aide !
:roll:
Merci d'avance
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

ViPHP
ViPHP | 1961 Messages

22 nov. 2006, 18:10

Bonjour,
Y-a pas un souci ici?
FROM noeud parent, noeud child, noeud_rel
Les espaces me semblent biz...
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 441 Messages

22 nov. 2006, 18:16

Bonjour,
Y-a pas un souci ici?
FROM noeud parent, noeud child, noeud_rel
Les espaces me semblent biz...
Ce sont des alias car je joint la table noeud 2 fois.
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

ViPHP
ViPHP | 1961 Messages

22 nov. 2006, 18:22

Je m'en doutais, mais comme ici tu utilises le 'AS'
child.noeud_id as noeud_id_c
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 441 Messages

22 nov. 2006, 18:29

non plus ;)
j'ai testé en utilisant l'alias, cela ne fonctionne pas et en plus cette requête fonctionne parfaitement sous mysql 4.1.9 ;)

Par contre j'ai trouvé des posts depuis le CMS Mambo où ils ont eu le même soucis.
Apparemment il y a un changement de syntaxe (si on peut dire):

En gros voici l'exemple :

Code : Tout sélectionner

select * from A,B left join C on A.col1 = C.col2
doit être remplacé par :

Code : Tout sélectionner

select * from (A,B) left join C on A.col1 = C.col2
Notez les parenthèses autour de la clause from !

Voilà du moins l'exécution de la requête se passe bien faut que je vérifie si cela ramène le bon résultat (normalement oui!).
Modifié en dernier par starkeus le 22 nov. 2006, 18:30, modifié 1 fois.
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 nov. 2006, 22:34

La gestion des jointures a quelque peu changé entre 4.1 et 5.0, les changements sont expliqué dans le manuel de MySQL à "JOIN syntax". Il va probablement te falloir réordonner les tables (dans la requête uniquement, c'est d'un point de vue syntaxique uniquement) et/ou utiliser des parenthèses là où ça va bien. Si besoin est, tu peux remplacer les virgules par des "JOIN" ou "INNER JOIN", ils sont identiques.

Pour plus de clarté, tu devrais penser également à déclarer la table d'origine de chaque colonne, par exemple dans

Code : Tout sélectionner

noeud_rel_parent=parent.noeud_id
...on ne sait pas d'où provient "noeud_rel_parent". Accessoirement, je recommande généralement de placer les conditions de jointure dans le ON quand on utilise JOIN à la place des virgules, ça permet de vérifier que toutes les jointures sont effectuées correctement. (dans ton exemple je ne sais pas comment est jointe la table "child")

En dernier, je recommande de conserver le noms des colonnes à travers les tables à chaque fois que cela est possible. Par exemple, "service_noeud_rel_service" devrait s'appeler "service_id" puisqu'il s'agit apparemment d'une clé étrangère pour service.service_id

PS: une astuce, si tu n'es pas sûr de l'interprétation d'une requête sous MySQL 5.0 essaie "EXPLAIN EXTENDED SELECT ...". Après exécution, la requête telle qu'elle a été interprétée peut être récupérée par

Code : Tout sélectionner

SHOW WARNINGS

Eléphant du PHP | 441 Messages

22 nov. 2006, 23:10

Merci je vais vérifier ytout ça.
Par contre pour le schéma de la BD, je n'ai pas trop le choix vu que je récupère le projet :)
Je crois que je vais avoir des journées sympas à tester toutes les requêtes...
:roll:
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

ViPHP
fab
ViPHP | 2657 Messages

22 nov. 2006, 23:11

Et le tag Résolu ? :p ( ça m'éviterai de lire tout le sujet pour rien vu que j'ai toujours pas le reflexe de lire le dernier message :p )
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 nov. 2006, 23:39

Bah, pour le nom des colonnes tu peux toujours essayer de faire une recherche sur "service_noeud_rel_noeud" à travers les fichiers, ça m'étonnerait que le nom soit utilisé pour quoi que ce soit d'autre :) Mais je suis d'accord avec toi, ce n'est probablement pas une priorité.