[Résolu] Requête MySQL rétive

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Répondre
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

[Résolu] Requête MySQL rétive

Message par Ymai »

Bonjour
Sur une base MySQL 4 (chez OVH), je lance la requête suivante:

Code : Tout sélectionner

SELECT *
FROM ades_faits, ades_eleves
LEFT JOIN ades_retenues ON ( ades_faits.idretenue = ades_retenues.idretenue )
LEFT JOIN ades_listeFaits ON ( ades_listeFaits.id_ListeFait = ades_faits.type )
WHERE ades_faits.ladate >= '2006-10-1'
AND ades_eleves.ideleve = ades_faits.ideleve
Elle me retourne les résultats attendus.
Sur une base MySQL5 sur mon PC (PHP5/Fedora5), je lance la même requête et j'obtiens un message d'erreur
MySQL a répondu
#1054 - Unknown column 'ades_faits.idretenue' in 'on clause'
Je confirme que le champ "idretenue" de la table "ades_faits" existe, contrairement à ce que le message d'erreur annonce.
Un

Code : Tout sélectionner

SELECT *
FROM ades_faits
WHERE ades_faits.idretenue >=1
ne laisse aucun doute en retournant les résultats attendus.

Sans doute une erreur au niveau du LEFT JOIN. Mais le manuel ne m'aide pas.
Merci pour tout coup de pouce.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7
Dernière modification par Ymai le 05 nov. 2006, 00:16, modifié 1 fois.
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Re: Requête MySQL rétive

Message par calimo »

Ymai a écrit :Bonjour
Sur une base MySQL 4 (chez OVH), je lance la requête suivante:

Code : Tout sélectionner

SELECT *
FROM ades_faits, ades_eleves
LEFT JOIN ades_retenues ON ( ades_faits.idretenue = ades_retenues.idretenue )
LEFT JOIN ades_listeFaits ON ( ades_listeFaits.id_ListeFait = ades_faits.type )
WHERE ades_faits.ladate >= '2006-10-1'
AND ades_eleves.ideleve = ades_faits.ideleve
Dans le from, tu ne devrais pas appeler toutes les tables, c'est-à-dire

Code : Tout sélectionner

FROM ades_faits, ades_retenues, ades_listeFaits
Note quand-même que je ne suis pas très ami avec la syntaxe des join :?

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Merci pour l'idée. Toutefois, le SELECT ne porte sur aucun élément de la table "listeFaits".
J'ai essayé quand même. Mais c'est encore pire. Cette fois, je ne vois plus à quoi peut correspondre l'erreur. Peut-être le fait que la même table se trouve à gauche et à droite de la jointure?
Erreur

requête SQL

SELECT *
FROM ades_faits, ades_eleves, ades_listeFaits
LEFT JOIN ades_retenues ON ( ades_faits.idretenue = ades_retenues.idretenue )
LEFT JOIN ades_listeFaits ON ( ades_listeFaits.id_ListeFait = ades_faits.type )
WHERE ades_faits.ladate >= '2006-10-1'
AND ades_eleves.ideleve = ades_faits.ideleve
LIMIT 0 , 30

MySQL a répondu
#1066 - Not unique table/alias: 'ades_listeFaits'
Même réponse sur la base MySQL4...
[edit]Celle-ci fonctionne


Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7

Code : Tout sélectionner

SELECT ades_faits. *
FROM ades_faits
LEFT JOIN ades_retenues ON ( ades_retenues.idretenue = ades_faits.idretenue )
LEFT JOIN ades_listeFaits ON ades_listeFaits.id_ListeFait = ades_faits.type
WHERE ades_faits.ladate >= '2006-11-1'
[/edit]
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Ymai a écrit :MySQL a répondu
#1066 - Not unique table/alias: 'ades_listeFaits'
À quoi sert cette table ades_listeFaits ? Je ne vois pas trop ce qu'elle vient faire là-dedans au juste... tu es sûr que c'est bien une table ?

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Re: Requête MySQL rétive

Message par Benoit »

calimo a écrit :Dans le from, tu ne devrais pas appeler toutes les tables
Certainement pas :)

Si tu fais toutes tes jointures explicitement ça ne fonctionne pas mieux ?

Code : Tout sélectionner

SELECT *
FROM ades_faits
JOIN ades_eleves ON ades_eleves.ideleve = ades_faits.ideleve
LEFT JOIN ades_retenues ON ades_faits.idretenue = ades_retenues.idretenue
LEFT JOIN ades_listeFaits ON ades_listeFaits.id_ListeFait = ades_faits.type
WHERE ades_faits.ladate >= '2006-10-1';
calimo: au vu de la dernière jointure je pense que ades_listeFaits est simplement une liste des types de faits répertoriés (et devrait sans doute s'appeler ades_typefaits ou quelque chose d'approchant).
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Je suis d'autant plus formel que la requête fonctionne sur une autre BD.

La structure est (sans doute trop) complexe.
La BD permet de gérer l'administration de l'ensemble des faits disciplinaires dans un établissement scolaire.
la table _listeFaits est un inventaire des faits disciplinaires existants:
- exclusion du cours
- remarque simple
- retenue
- renvoi
- ...

Donc, dans la requête, on va indiquer la nature du fait en allant la cherche par son nom dans la table des fait existants.

La requête originale est nettement plus complexe que la version simple donnée plus haut. Mais la version simple cale déjà sur mon PC.

Code : Tout sélectionner

SELECT ades_faits . * , ades_listeFaits.fait AS lefait, ades_retenues.ladate AS dateretenue, ades_retenues.duree AS duree, ades_retenues.heure AS heure, ades_eleves.classe AS classe, ades_eleves.nom AS nom, ades_eleves.prenom AS prenom, ades_eleves.contrat AS contrat
FROM ades_faits, ades_eleves
LEFT JOIN ades_retenues ON ades_faits.idretenue = ades_retenues.idretenue
LEFT JOIN ades_listeFaits ON ades_listeFaits.id_ListeFait = ades_faits.type
WHERE ades_faits.ladate >= '2006-11-1'
AND ades_eleves.ideleve = ades_faits.ideleve
AND ades_faits.supprime != 'O'
ORDER BY ades_eleves.classe, ades_eleves.ideleve, ades_faits.type
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Re: Requête MySQL rétive

Message par calimo »

Benoit a écrit :
calimo a écrit :Dans le from, tu ne devrais pas appeler toutes les tables
Certainement pas :)
Ah ben ça explique peut-être pourquoi j'ai jamais réussi à faire un join comme il faut :oops:

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Re: Requête MySQL rétive

Message par Ymai »

Benoit a écrit : Si tu fais toutes tes jointures explicitement ça ne fonctionne pas mieux ?

Code : Tout sélectionner

SELECT * 
FROM ades_faits
JOIN ades_eleves ON ades_eleves.ideleve = ades_faits.ideleve
LEFT JOIN ades_retenues ON ades_faits.idretenue = ades_retenues.idretenue
LEFT JOIN ades_listeFaits ON ades_listeFaits.id_ListeFait = ades_faits.type
WHERE ades_faits.ladate >= '2006-10-1';
Effectivement, c'est nettement mieux.
Je vais toutefois faire quelques tests sur la BD qui fonctionne avant de décréter que c'est résolu.
Ceci dit, j'aimerais bien comprendre pourquoi l'ancienne syntaxe ne fonctionne plus.
Un tout grand merci provisoire... mais que j'espère définitif.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

Je sais qu'il y a eu des changements dans MySQL 5 pour mieux respecter le SQL standard. Je ne sais pas dans quelle mesure ça peut affecter ce genre de syntaxe, mais en pratique il vaut mieux toujours faire ses jointures de la même façon au sein d'une requête. Soit toutes implicites, soit toutes explicites.

Je dirais qu'à partir du moment où on fait jouer plus de deux ou trois tables il vaut mieux séparer les jointures de la clause de sélection, ne fut-ce que pour la lisibilité de la requête. Je sais que sur certains SGBD ça améliore également les performances, mais je ne crois pas que ce soit le cas pour MySQL.
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Merci pour l'info dont je tiendrai compte à l'avenir.
Curieusement, les sources d'informations alternatives consultées (y compris le site web officiel MySQL) évoquent à peine JOIN sans LEFT.
J'ai donc diablement bien fait de poser ma question ici.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 8 invités