Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2011, 14h37   #1
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 93
Points : 33
Points : 33
Par défaut Auto jointure externe condition pre jointure

Bonjour,

MySQL 5.0.51a

J'ai une table qui en gros contient les infos suivantes (OBJET [CHAINE],DATE D AJOUT [DATE]).

Chaque jour des objets sont insérés et je voudrai savoir quel objets ont été inséré la veille mais pas le jour courant.

En gros mes objet insérés hier minus mes objets insérés aujourd'hui. En regardant la donc mysql j'ai vu que le minus n'existait pas (oui je decouvre mysql) du coups j'ai voulu le faire à base de jointure externe avec clé à droite = nulle. Solution qui fonctionnellement revient au meme.

Mon problème est que ma requête ne me renvoie pas le resultat escompté, et que j'ai l'impression que ma condition WHERE CLE DE MA TABLE A DROITE IS NULL ne fonctionne pas comme une condition post jointure comme sur oracle par exemple.

En élagant ma requete je suis tombé sur ce cas que je trouve bizarre.
Mes conditions pre jointure sur la date contenue dans ma table devrait me permettre de filtrer les bonnes date pour VEILLE et JOUR mais je tombe sur le résultat suivant alors que je ne devrait avoir que la date de sysdate -1 jour

Code :
1
2
3
SELECT DISTINCT VEILLE.MA_DATE FROM TABLE_A VEILLE LEFT OUTER JOIN TABLE_A JOUR ON JOUR.REF = VEILLE.REF
AND date_format( JOUR.MA_DATE, '%Y%m%d' ) = date_format( sysdate( ) , '%Y%m%d' )
AND date_format( VEILLE.MA_DATE, '%Y%m%d' ) = date_format( SUBDATE( sysdate( ) , 1 ) , '%Y%m%d' )
Code :
1
2
2011-10-05
2011-10-06
Avez vous une idée de la ou je me suis planté

Merci d'avance
HurtMarley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 14h51   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Avec la requête remise en forme, on voit déjà un problème qui est peut-être la cause de ton mauvais résultat :
Code :
1
2
3
4
5
SELECT DISTINCT VEILLE.MA_DATE 
FROM TABLE_A VEILLE 
LEFT OUTER JOIN TABLE_A JOUR ON JOUR.REF = VEILLE.REF
    AND date_format( JOUR.MA_DATE, '%Y%m%d' ) = date_format( sysdate( ) , '%Y%m%d' )
    AND date_format( VEILLE.MA_DATE, '%Y%m%d' ) = date_format( SUBDATE( sysdate( ) , 1 ) , '%Y%m%d' )
=> Tu as mis une condition de restriction sur la table de gauche dans la condition de jointure. Ça fonctionne peut-être mais ce n'est pas très logique ni élégant.

Pourquoi veux-tu formater les dates dans les conditions ? Si ta colonne est de type DATE, c'est inutile ! Et en utilisant la fonction standard SQL CURRENT_DATE, la comparaison devrait se faire sans souci.

Essaie comme ceci :
Code :
1
2
3
4
5
SELECT DISTINCT VEILLE.MA_DATE 
FROM TABLE_A VEILLE 
LEFT OUTER JOIN TABLE_A JOUR ON JOUR.REF = VEILLE.REF
    AND JOUR.MA_DATE = CURRENT_DATE
WHERE VEILLE.MA_DATE = SUBDATE( CURRENT_DATE , 1)
Mais tu veux connaître les objets et tu ne sélectionnes que la date ! Bizarre non ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 17h18   #3
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 93
Points : 33
Points : 33
Merci pour ta réponse.
J'ai laissé la condition dans la clause de jointure car j'étais parti sur un FULL OUTER ... avant de voir que ça n'existait pas.
Du coups en effet la restriction de ma table gauche dans la jointure n'était pas tres élégante même si je ne voit pas en quoi cela peut poser problème (en comparaison à d'autres sgbd que je connais)

Toujours est il que le problème vient bien de la

Pour tes autres questions : le CURRENT_DATE j'ai du y passer à coté dans la doc.

Et le bout de requète que j'ai envoyé sans les objet et la portion sur laquelle j'avait identifié le problème, j'ai viré tout ce qui marchait pour être succint.


En tout cas merci beaucoup.
HurtMarley est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h59.


 
 
 
 
Partenaires

Hébergement Web