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

Langage SQL Discussion :

Requête SQL LEFT OUTER JOIN


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Par défaut Requête SQL LEFT OUTER JOIN
    Bonjour à tous,

    J'ai un petit souci avec une requête.
    Je souhaite afficher ma liste des produits (tous mes produits) et afficher un prix mini, maxi et moyen.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT pc.id_produit, pt.type, pc.id_type, pc.produit, AVG(rp.prix) AS prix_moyen, MIN(rp.prix) AS prix_mini, MAX(rp.prix) AS prix_maxi
    FROM produit_conc pc
    JOIN produit_type pt
    ON pt.id_type=pc.id_type
    LEFT JOIN report_prix rp
    ON rp.id_produit=pc.id_produit
    LEFT JOIN report_tete rt
    ON rt.id_report=rp.id_report
    WHERE YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
    GROUP BY pc.id_produit
    ORDER BY pt.type DESC, pc.produit
    J'ai remarqué une chose :
    Si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(rt.date_visite)='".$annee."'";
    ça n'affiche que les produits ou il y a eu une saisie
    Si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND YEAR(rt.date_visite)='".$annee."'";
    ça affiche bien tous les produits mais ça ne prend pas en compte le critère de date mois et année.

    Merci d'aavance de vootre aide !

  2. #2
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    Peux tu preciser ce que doit filtrer ton critere de date et ce que souhaites afficher au final

    Un petit éclaircissement sur la structure et les liens entres tes tables serait le bienvenue aussi

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 817
    Billets dans le blog
    14
    Par défaut
    La colonne rt.date_visite est-elle de type alphanumérique ?
    Si ce n'est pas le cas, il vaut mieux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    WHERE YEAR(rt.date_visite)=".$annee."
    ...
    Pour ton problème de prise en compte de la restriction sur le mois et l'année, si tu la mets dans le WHERE, elle s'applique sur tout ce qu'il y a dans le SELECT donc seuls les produits ayant une date de visite seront affichés, ce qui reviendrait à faire un INNER JOIN au lieu d'un LEFT OUTER JOIN sur la table report_tete.
    Pour que la restriction ne s'applique qu'à la table report_tete, il faut l'ajouter à la condition de jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LEFT JOIN report_tete rt 
      ON rt.id_report=rp.id_report
      AND YEAR(rt.date_visite)='".$annee."'
      AND MONTH(rt.date_visite)='".$id_mois."'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Par défaut
    Merci de votre aide.

    Mon champ rt.date_viste est de type date.
    En fauit je débute et si j'ai bien compris pour du numérique je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(rt.date_visite)=".$annee."
    Et pour le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(rt.date_visite)='".$annee."'
    Pour le champ type date je choisis donc la première solution ?

    Voilà ma reqête modifié mais les critères de date ne sont toujours pas pris en compte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SELECT pc.id_produit, pt.type, pc.id_type, pc.produit, AVG(rp.prix) AS prix_moyen, MIN(rp.prix) AS prix_mini, MAX(rp.prix) AS prix_maxi
     
    FROM produit_conc pc
     
    JOIN produit_type pt
    ON pt.id_type=pc.id_type
     
    LEFT OUTER JOIN report_prix rp
    ON rp.id_produit=pc.id_produit
     
    LEFT OUTER JOIN report_tete rt
    ON rt.id_report=rp.id_report
    AND YEAR(rt.date_visite)=".$annee."
    AND MONTH(rt.date_visite)=".$id_mois."
     
    GROUP BY pc.id_produit
    ORDER BY pt.type DESC, pc.produit
    Les conditions sont pourtant bien dans la jointure non ?

    Merci d'avance de votre aide.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 817
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dam28800 Voir le message
    Mon champ rt.date_viste est de type date.
    En fait je débute et si j'ai bien compris pour du numérique je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(rt.date_visite)=".$annee."
    Et pour le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(rt.date_visite)='".$annee."'
    Pour le champ type date je choisis donc la première solution ?
    Ce n'est pas à cause du type date qu'il est mieux de prendre la première écriture, au temps pour moi, c'est parce que la fonction YEAR renvoie un nombre, donc un type numérique et non pas alphanumérique.

    Voilà ma requête modifiée mais les critères de date ne sont toujours pas pris en compte...
    Les conditions sont pourtant bien dans la jointure non ?
    Ben oui. L'erreur peut venir des variables de programme. Il faudrait capturer la chaîne SQL réellement envoyée au SGBD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Par défaut
    Merci de ton aide.

    En tant que débutant je n'ai aps tout compris à ta réponse ...

    Qu'entend tu par variable de programme ?
    Mes variables $annee et $mois ?

    Je les ai testées et elles me renvoient bien le mois et l'année que je recherche, de plus il y a une entrée dans ma table qui correspond au mois et à l'année testée.

    Et comment capturer la chaine réellement envoyé au SGBD ?

    Merci d'avance pour ton aide.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 817
    Billets dans le blog
    14
    Par défaut
    Si c'est, comme je le suppose, du php/mysql, tu insères juste avant la ligne qui contient mysql_query le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "<br />requête : <br />$variablecontenantletextedelarequete";
    exit;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Par défaut
    Pour que la date soit prise en compte dans les prix, il faut lier l'ensemble report_prix et report_tete en INNER, et lier le tout en LEFT OUTER à produit.

    La requête devient celle-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT pc.id_produit, pt.type, pc.id_type, pc.produit, AVG(rp.prix) AS prix_moyen, MIN(rp.prix) AS prix_mini, MAX(rp.prix) AS prix_maxi
    FROM produit_conc pc
    JOIN produit_type pt
    ON pt.id_type=pc.id_type
     
    LEFT JOIN report_prix rp
    JOIN report_tete rt
    ON rt.id_report=rp.id_report
    AND YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
     
    ON rp.id_produit=pc.id_produit
    GROUP BY pc.id_produit
    ORDER BY pt.type DESC, pc.produit
    Ca devrait marcher.

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Par défaut
    Bonjour,

    Je viens de tster ta requête et à priori elle ne fonctionne pas (le critère date n'est pas pris en compte car date à NULL)

    Merci de ton aide.

Discussions similaires

  1. [MySQL] Requête & Jointure LEFT OUTER JOIN
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/03/2012, 14h22
  2. [Hôtel SQL Pro] Requête PostgreSQL LEFT OUTER
    Par MaitrePylos dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/10/2011, 11h15
  3. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  4. SQL server 2005 : left outer join
    Par backdraf dans le forum Développement
    Réponses: 3
    Dernier message: 31/05/2011, 18h04
  5. left outer join SQL/ODBC
    Par chidalife dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 17/06/2010, 09h49

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