Page 1 sur 1

Mon innerjoin ne fonctionne pas.

Posté : 20 févr. 2013, 23:58
par Jalance
Bonjour,
Voici une requête que j'ai fait mais qui ne veut pas fonctionner. Elle sert à afficher des concours se terminant dans les 5 jours suivant. Ces concours sont basés dans une table appelé "concours". Certains de ces concours ont des réponses (genre indice télé) qui se trouvent dans une table "reponses". Je tente donc d'associer les réponses avec les concours concernés tout en excluant ceux de la "page_perso". Voici ma requête:
SELECT * FROM concours INNER JOIN reponses ON concours.id_concours = reponses.id_concours WHERE datelimite BETWEEN CURRENT_DATE AND DATE_ADD( CURRENT_DATE,INTERVAL+5DAY) 
AND id_concours NOT IN (SELECT pid_concours FROM page_perso WHERE rpseudo ='$login')
ORDER BY datelimite ASC
Ça me donne une erreur de syntaxe qui est celle-ci: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND id_concours NOT IN (SELECT pid_concours FROM perso WHERE rpseudo ='$login' at line 2

Je vous avouerai que je ne vois pas trop mon erreur donc, je fais appel
à vos lumières. Merci de votre aide.

Re: Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 05:44
par AB
essaies DATE_ADD(CURRENT_DATE, INTERVAL 5 DAY)

A part ça il serait mieux de lever l'ambiguîté sur les deux "AND" qui se suivent.

Re: Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 08:08
par Jalance
essaies DATE_ADD(CURRENT_DATE, INTERVAL 5 DAY)

A part ça il serait mieux de lever l'ambiguîté sur les deux "AND" qui se suivent.

Merci pour ta réponse Ab. J'ai testé ce que tu m'as proposé et c'est là qu'une erreur d'ambiguité apparaît car le problème de synthaxe semble réglé. Je t'avouerai que si j'enlève l'"inner join", tout fonctionne parfaitement mais ça ne règle pas mon problème. Que faire pour contourner l'ambiguité? C'est la première fois que ça m'arrive.
Merci.

Re: Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 17:51
par AB
Tu peux mettre des parenthèses pour délimiter le between ou encore ne pas utiliser le between et mettre deux AND à la place (d'ailleurs je recommande car le between peut être ambigu dans certains cas) ou encore inverser l'ordre des conditions :

Code : Tout sélectionner

WHERE id_concours NOT IN (SELECT pid_concours FROM page_perso WHERE rpseudo ='$login') AND datelimite BETWEEN CURRENT_DATE AND DATE_ADD( CURRENT_DATE,INTERVAL+5DAY)

Re: Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 19:19
par Jalance
Merci AB!
J'ai enfin réglé le problème d'ambiguité et j'ai suivi tes instructions. C'est là que je me suis aperçu que l'inner join" était inapproprié car il n'affichait que les concours ayant une réponse. J'ai donc utilisé un "left join" qui était plus adéquat. Voici ma requête revue et corrigée pour fin d'informations pour les membres qui auraient un problème similaire:
SELECT * FROM concours LEFT JOIN reponses ON concours.id_concours = reponses.id_concours WHERE  concours.id_concours NOT IN (SELECT pid_concours FROM perso WHERE rpseudo ='$login') AND datelimite BETWEEN CURRENT_DATE AND DATE_ADD( CURRENT_DATE,INTERVAL 5 DAY)
AND concours.id_concours NOT IN (SELECT pid_concours FROM perso WHERE rpseudo ='$login')
 ORDER BY datelimite ASC

Merci de ton aide AB! Très apprécié! :)

Re: [RESOLU] Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 20:15
par AB
La ligne juste avant le ORDER BY est de trop (à supprimer) :)

Re: [RESOLU] Mon innerjoin ne fonctionne pas.

Posté : 21 févr. 2013, 21:36
par Jalance
Ouch! Ben oui! :shock:
SELECT * FROM concours LEFT JOIN reponses ON concours.id_concours = reponses.id_concours WHERE  concours.id_concours NOT IN (SELECT pid_concours FROM perso WHERE rpseudo ='$login') AND datelimite BETWEEN CURRENT_DATE AND DATE_ADD( CURRENT_DATE,INTERVAL 5 DAY)
ORDER BY datelimite ASC
Voilà! Final, point barre! :D
Merci AB!