Page 1 sur 1

erreur dans ma requête ?

Posté : 14 avr. 2006, 09:17
par pitav
Bonjour à tous

Cette requête fonctionne correctement sur mon ordinateur...

Code : Tout sélectionner

"SELECT c.titre, c.ref, c.detail_instru, c.prix, c.id_auteur1, c.id_auteur2,i.instrument, au_1.nom AS nom1, au_1.prenom AS prenom1, au_2.nom AS nom2, au_2.prenom AS prenom2 FROM catalogue AS c, Instruments AS i, Auteurs AS au_1, Auteurs AS au_2 WHERE c.id_instrument = i.id AND au_1.id = c.id_auteur1 AND au_2.id = c.id_auteur2 ORDER BY ref DESC LIMIT 10;"
... mais sur le serveur de online il me renvoit le message d'erreur suivant :

Erreur dans l'execution de la requete 'SELECT c.titre, c.ref, c.detail_instru, c.prix, c.id_auteur1, c.id_auteur2,i.instrument, au_1.nom AS nom1, au_1.prenom AS prenom1, au_2.nom AS nom2, au_2.prenom AS prenom2 FROM catalogue AS c, Instruments AS i, Auteurs AS au_1, Auteurs AS au_2 WHERE c.id_instrument = 0 AND c.id_instrument = i.id AND au_1.id = c.id_auteur1 AND au_2.id = c.id_auteur2 ORDER BY ref DESC'. Message de MySQL : The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Quelqu'un aurait-il une idée pour corriger l'erreur ?

Merci

Posté : 14 avr. 2006, 09:28
par Cobaye
pff perso je trouve ses requetes illisibles ! faites les jointures avec inner join, left join et right join ! c'est plus optimisé et plus facile en lecture !

ca donnerai quelques choses comme ca

Code : Tout sélectionner

SELECT catalogue.titre, catalogue.ref, catalogue.detail_instru, catalogue.prix, catalogue.id_auteur1, catalogue.id_auteur2, Instruments.instrument, au1.nom AS nom1, au1.prenom AS prenom1, au2.nom AS nom2, au2.prenom AS prenom2 FROM catalogue INNER JOIN Instruments ON catalogue.id_instrument=Instruments.id LEFT JOIN Auteurs as au1 ON Instruments.id_auteur1 = au1.id LEFT JOIN Auteurs as au2 ON Instruments.id_auteur2 = au2.id ORDER BY ref DESC LIMIT 10;

Posté : 14 avr. 2006, 13:13
par Hubert Roksor
@Cobaye: C'est bizarre, j'ai toujours préféré utiliser une virgule parce que c'est plus court. (plus lisible pour moi) En revanche, je ne comprends pas ce que tu entends par "plus optimisé". Le manuel nous dit que les deux sont sémantiquement équivalents (INNER JOIN ayant précédence sur la virgule, mais en règle générale en s'en fiche).

@pitav: le message d'erreur dit que ta requête examinerait trop d'enregistrements si elle était exécutée, donc elle est probablement fausse. Ajoute un "c.id_instrument = 123" pour ne récupérer que les enregistrements de l'instrument 123 et voir si le résultat correspond à ce que tu souhaites obtenir.

Posté : 14 avr. 2006, 14:23
par Cobaye
J'ai écris un tuto sur direction PHP sur le sujet avec deux exécutions de requête avec une jointure.

Quand tu fais une requête multicritère avec plusieurs jointures etc... en lecture pour moi y a pas photo 10 fois plus lisible avec les inner join. En plsu en where comment veux tu faire simplement des left join ?

Si tu veux l'article que j'ai écris envoie moi un message et te l'enverrai

Posté : 14 avr. 2006, 14:55
par Hubert Roksor
Loin de moi l'idée de remplacer toutes les jointures par des virgules ! Je disais simplement que dans le cas présent c'était surtout une question de préférence personnelle. Je ne vois aucune raison objective de préférer lNNER JOIN à une virgule, à part dans les cas où la précédence des jointures est important, c'est à dire lorsqu'on joint la troisième table à la première sans utiliser de parenthèses pour exprimer clairement l'ordre des jointures.

Dans ton précédent post tu disais "c'est plus optimisé" mais je pense que tu parlais du confort visuel, pas des performances c'est ça ? Je n'ai pas pris la peine de vérifier sur d'anciennes version, mais sous MySQL 5.0.19 "INNER JOIN", "CROSS JOIN" et "," sont automatiquement remplacés par "JOIN" en interne. (d'après EXPLAIN EXTENDED)

Posté : 14 avr. 2006, 15:00
par Cobaye
Optimiser en performance aussi !

j'ai mis le tuto dans ma signature, regarde à la fin du tuto !

Enfin l'important c'est d'être à l'aise dans l'une ou l'autre écriture

Posté : 14 avr. 2006, 15:07
par Hubert Roksor
Je viens de jeter un œil sur l'article, c'est étrange... Je vais essayer de reproduire cette requête pour en savoir plus, car ça m'intrigue. Si tu as toujours la base de données sous la main, pourrais-tu me donner une estimation de la taille des deux tables et la cardinalité des deux champs stp ?

Posté : 14 avr. 2006, 15:11
par pitav
Je me suis absenté.
J'essaye vos propositions.
Merci pour ces premières explications.
Je vous tiens au courant.

Posté : 21 avr. 2006, 10:20
par pitav
Bonjour à tous
Merci Cobaye pour ton tutu.
Je trouve effectivement plus clair de séparer les jointure de la clause WHERE.

J'ai donc rédiger une nouvelle requête qui fonctionne parfaitement sur mon serveur.

Code : Tout sélectionner

SELECT c.titre, c.ref, c.detail_instru, c.prix, i.instrument, c.id_auteur1, c.id_auteur2, au_1.nom AS nom1, au_2.nom AS nom2 FROM catalogue AS c INNER JOIN Instruments AS i ON c.id_instrument = i.id LEFT JOIN Auteurs AS au_1 ON c.id_auteur1 = au_1.id LEFT JOIN Auteurs AS au_2 ON c.id_auteur2 = au_2.id ORDER BY ref DESC LIMIT 10;
Malheureusement, le serveur de online me retourne toujours la même réponse :

Erreur dans l'execution de la requete 'SELECT c.titre, c.ref, c.detail_instru, c.prix, i.instrument, c.id_auteur1, c.id_auteur2, au_1.nom AS nom1, au_2.nom AS nom2 FROM catalogue AS c INNER JOIN Instruments AS i ON c.id_instrument = i.id LEFT JOIN Auteurs AS au_1 ON c.id_auteur1 = au_1.id LEFT JOIN Auteurs AS au_2 ON c.id_auteur2 = au_2.id ORDER BY ref DESC LIMIT 10;'. Message de MySQL : The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Quelqu'un à une suggestion SVP ?

Merci

Posté : 21 avr. 2006, 10:26
par zeus
Le message d'erreur te dit que ta requête (du moins les JOIN) a retourné plus de lignes que le maximum autorisé ;)

Il va donc falloir revoir ta requete ou passer aux jointure en mémoires