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.

Ce contenu a été publié dans Développement Web. Vous pouvez le mettre en favoris avec ce permalien.

4 réponses à Jointures et MySQL 5

  1. Piou2fois dit :

    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…

  2. Olivier dit :

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

  3. JMF dit :

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

  4. Olivier dit :

    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é.

Les commentaires sont fermés.