IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Auto jointure externe condition pre jointure


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Points : 67
    Points
    67
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2011-10-05
    2011-10-06
    Avez vous une idée de la ou je me suis planté

    Merci d'avance

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Points : 67
    Points
    67
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2011, 10h05
  2. condition sur jointure externe gauche
    Par paolo2002 dans le forum Développement
    Réponses: 0
    Dernier message: 21/06/2010, 15h47
  3. [ZF 1.5] Jointure externe contenant une jointure interne...
    Par Eusebe dans le forum Zend_Db
    Réponses: 1
    Dernier message: 25/04/2008, 14h10
  4. Auto jointure (externe) sur clés etrangères
    Par mauvais_karma dans le forum Langage SQL
    Réponses: 13
    Dernier message: 30/11/2006, 13h46
  5. [requetes / Jointures externes] : expression de jointure
    Par Ptit_boeuf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/07/2005, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo