Différence left join entre mysql 4 et 5

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 : Différence left join entre mysql 4 et 5

par Hubert Roksor » 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é.

par fab » 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 )

par starkeus » 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:

par Hubert Roksor » 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

par starkeus » 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!).

par Ajoloca » 22 nov. 2006, 18:22

Je m'en doutais, mais comme ici tu utilises le 'AS'
child.noeud_id as noeud_id_c

par starkeus » 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.

par Ajoloca » 22 nov. 2006, 18:10

Bonjour,
Y-a pas un souci ici?
FROM noeud parent, noeud child, noeud_rel
Les espaces me semblent biz...

Différence left join entre mysql 4 et 5

par starkeus » 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