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

  1. #1
    Membre du Club
    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
    Points : 69
    Points
    69
    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 du Club
    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
    Points : 58
    Points
    58
    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
    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
    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. 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 !

  4. #4
    Membre du Club
    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
    Points : 69
    Points
    69
    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
    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
    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. 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 !

  6. #6
    Membre du Club
    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
    Points : 69
    Points
    69
    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
    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
    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. 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 !

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je ne connais pas my sql mais à ma connaissance indépendemment du critère sur year(), il me semble que la requète devrait planter, car le group by n'est pas sur tous les champs non aggrégés, donc cela donnerait:
    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
    	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, pt.type, pc.id_type, pc.produit
    ORDER BY pt.type DESC, pc.produit
    D'autre par puisque rt.date_visite est une date autant formuler la condition ainsi :rt.date_visite entre le 1er du mois $id_mois de l'année $annee et le 1er du mois suivant, les deux dates étant calculés avant et on obtient.
    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
    	ON rp.id_produit=pc.id_produit
    	LEFT JOIN report_tete rt
    	ON rt.id_report=rp.id_report
    WHERE rt.date_visite>=date_premier_mois
    	  and rt.date_visite<date_premier_mois_suivant
    GROUP BY pc.id_produit, pt.type, pc.id_type, pc.produit
    ORDER BY pt.type DESC, pc.produit
    cela évite au SGBD de calculer YEAR(rt.date_visite) et MONTH(rt.date_visite)
    autant de fois qu'il y a de lignes, les bornes elles sont calculées une seule fois.
    Cordialement
    Soazig

  9. #9
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Merci à vous.

    ALors touhours pas le résultat souhaitée, voilà ci-dessous le dernier état de 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
    14
    15
    16
     
    $retour = mysql_query('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 rt.date_visite LIKE '$annee-$id_mois-__'
     
    GROUP BY pc.id_produit, pt.type, pc.id_type, pc.produit
    ORDER BY pt.type DESC, pc.produit');
    Je ne vois pas trop ou afficher la variable contenant ma requête, au pire je peux faire echo $retour après ma requête mais ça donne #id12 ...

    Pour le critère date j'ai essayé plusieurs méthodes mais rien n'y fait il n'est pas pris en compte.


    A la suite de cette requête qui liste les produits j'effectue une autre autre dans la boucle qui elle fonctionne, elle est un peu différente mais je vous la donne quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT AVG(rp.prix) AS prix_moyen1, MIN(rp.prix) AS prix_mini1, MAX(rp.prix) AS prix_maxi1
    FROM report_prix rp
    JOIN report_tete rt
    ON rt.id_report=rp.id_report
    JOIN pdv
    ON rt.id_pdv=pdv.id_pdv
    $critere_annee
    $critere_mois
    AND rp.id_produit='".$donnees['id_produit']."'
    AND pdv.enseigne='".$id_enseigne1."'
    Elle fait pour chaque produit le prix mini, maxi et moyen pour une enseigne.
    Les critères de dates fonctionnent bien.
    Merci d'avance de votre aide.

  10. #10
    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
    Je te conseille de faire ça en plusieurs étapes :
    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
    $req = "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 rt.date_visite LIKE '$annee-$id_mois-%'
    						
    GROUP BY pc.id_produit, pt.type, pc.id_type, pc.produit
    ORDER BY pt.type DESC, pc.produit";
    
    $retour = mysql_query($req) or die("Erreur SQL ! mysql_error());
    Et donc tu peux insérer le code juste avant $retour =... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "<br />Requête : <br />$req";
    exit;
    Au passage, j'ai corrigé en mettant des " autour de la requête puisqu'elle contient des variables entourées par des ' et j'ai corrigé aussi le LIKE qui doit finir par un % et non pas par __.
    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 !

  11. #11
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Ok, merci, alors voilà ce m'affiche le echo $retour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    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 rt.date_visite LIKE '2009-01-%' 
    GROUP BY pc.id_produit, pt.type, pc.id_type, pc.produit 
    ORDER BY pt.type DESC, pc.produit
    Merci d'avance.

  12. #12
    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
    Et l'exécution de cette requête directement sous MySQL (en ligne de commande ou via phpMyAdmin ou autre interface graphique) donne quel résultat ?
    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 !

  13. #13
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Je ne connaissais pas cette fonction.

    Le résultat est le même qu'un PHP, j'ai bien toutes mes lignes produits, mêmes celles avec les valeurs NULL mais le filtre date n'est pas pris en compte.

    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    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 rt.date_visite LIKE '2009-01%'
    GROUP BY pc.id_produit, pt.type, pc.id_type, pc.produit
    ORDER BY pt.type DESC , pc.produit
    LIMIT 0 , 30
    Je ne vois pas d'ou ça peut venir, merci encore pour ton aide précieuse !

  14. #14
    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
    Citation Envoyé par dam28800 Voir le message
    Le résultat est le même qu'un PHP, j'ai bien toutes mes lignes produits, mêmes celles avec les valeurs NULL mais le filtre date n'est pas pris en compte.
    Quand tu dis que le filtre date n'est pas pris en compte, ça veut dire que la requête effectue les calculs sur toutes les lignes de report_tete et pas seulement celles qui ont une visite en janvier 2009 ?
    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 !

  15. #15
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Oui, tout à fait, les calculs sont faits sur l'ensemnle des données et non pas les données d'un mois.

  16. #16
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Bonjour à tous,

    Je n'ai toujours pas de solution pour ce critère date, si quelqu'un passe par là...

    Merci d'avance.

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est très probablement parce que vous comparez une date avec une chaîne de caractère (pas bien CinePhil !).

    Mon vocabulaire MySQL étant nul, je ne peux pas vous conseiller sur la syntaxe, mais comparez des dates avec des dates.

  18. #18
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Merci dez votra aide, j'ai modifié les critères de ma recherche ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AND YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
    Le champ date_visite est de type Date dans MySql.
    Mais le résultat n'est pas là il ne le prend pas en compte...

    Avez-vous une idée ? Merci d'avance.

  19. #19
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Attendez j'ai peut être un début de solution.

    En effet si j'affiche rt.date_visite (en l'ajoutant dans ma requête au niveau du select) et que j'execute ma requete dans MySQL j'ai NULL qui apparait...

    Donc si le filtre date cherche sur une date NULL ça ne va pas marcher...

    Mais pourquoi il me met NULL alors que j'ai une date de visite renseigné ?

    Je regarde...

  20. #20
    Membre du Club
    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
    Points : 69
    Points
    69
    Par défaut
    Bonjour à tous, alors j'ai trouvé une reqête qui (à l'air) de fonctionner, la voici :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    SELECT pc.id_produit, pt.type, pc.produit, pt.id_type, 
     
    (SELECT AVG( prix ) FROM report_prix rp
    JOIN report_tete rt
    ON rp.id_report=rt.id_report
    AND YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
    JOIN produit_conc ON rp.id_produit = produit_conc.id_produit
    AND produit_conc.id_produit = pc.id_produit) AS prix_moyen,
     
    (SELECT MAX( prix ) FROM report_prix rp
    JOIN report_tete rt
    ON rp.id_report=rt.id_report
    AND YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
    JOIN produit_conc ON rp.id_produit = produit_conc.id_produit
    AND produit_conc.id_produit = pc.id_produit) AS prix_maxi,
     
    (SELECT MIN( prix ) FROM report_prix rp
    JOIN report_tete rt
    ON rp.id_report=rt.id_report
    AND YEAR(rt.date_visite)='".$annee."'
    AND MONTH(rt.date_visite)='".$id_mois."'
    JOIN produit_conc ON rp.id_produit = produit_conc.id_produit
    AND produit_conc.id_produit = pc.id_produit) AS prix_mini
     
    FROM produit_conc pc
    JOIN produit_type pt 
    ON pt.id_type = pc.id_type
    GROUP BY pc.id_produit, pc.id_type
    ORDER BY pt.type DESC, pc.id_produit ASC
    Voili voilou, alors je ne saisi pas si on peut l'optimiser ? Si oui j'attend vos réponses !

    Merci encore et d'avance !

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