Dur Comme Faire

Aller au contenu | Aller au menu | Aller à la recherche

Jointures et MySQL 5

Ce matin nous avons été confronté à un problème surprenant au travail. Une requête SQL qui passe très bien sur 2 serveurs mais qui indique qu'un champ est inconnu dans une jointure sur un troisième.

Après observation, la seule chose qui parraissait un peu étrange dans la requête SQL était le fait que l'une des jointures ne se faisait pas dans l'ordre logique. Voici un exemple simplifié de la requête illustrant le problème :

SELECT *
FROM `clients` AS c
INNER JOIN `groupes` AS g ON g.id = s.id_groupe
INNER JOIN `societes` AS s ON s.id = c.id_societe

En toute logique, il aurait fallu faire la jointure sur la table groupes après celle sur la table sociétés. Cependant cette requête passe parfaitement sur deux serveurs. Le second point étonnant est que ces fameux serveurs sont en version 4.1.12 tandis que celui qui pose problème est en 5.0.18. Rétablir l'ordre logique des jointures règle le problème.

Après quelques recherches, il s'avère que ce n'est pas un bug mais une nouvelle fonctionnalité. Afin de mieux coller au standard SQL:2003, MySQL a modifier sa gestion des jointures sur de nombreux points dont celui-ci. En attendant de modifier vos requêtes, vous pouvez rétablir le comportement de MySQL 4.0 en modifiant le mode SQL.

mercredi 12 avril 2006 à 14h47 - Développement Web Fil de syndication

Rétroliens

Aucun rétrolien pour le moment.

Les rétroliens pour ce billet sont fermés.

Commentaires

Gravatar de Piou2fois

La requête à l'origine n'était pas logique, c'est comme appeler une variable alors qu'elle n'est pas définie, ou définie plus loin.
Par contre l'erreur principale vient de l'interpréteur sql à l'origine qui acceptait ce genre de pratique, un peu comme les navigateurs web qui acceptent des horreurs dans le code...

Piou2fois le jeudi 13 avril 2006 à 11h15 Icone du permalien

Gravatar de Olivier

Tu as utilisé quel mode du coup pour ta requête ? à moins que tu l'aies changé ?

Olivier le mardi 18 avril 2006 à 17h37 Icone du permalien

Gravatar de JMF

Olivier> J'ai opté pour la solution la plus propre et la plus pérenne : la modification de mes requêtes.

JMF le mardi 18 avril 2006 à 17h42 Icone du permalien

Gravatar de Olivier

Je pose la question car je suis confronté à une appli livrée par un client et qu'elle ne passe pas sur mysql 5 à cause de certaines jointures.

pour le coup, un vrai mode mysql-4.0 m'aurait bien aidé.

Olivier le mardi 18 avril 2006 à 19h23 Icone du permalien

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.

XHTML - CSS - DotClear - Technorati

Les billets de ce blog sont sous licence Creative Commons