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 :

Problème avec une requete [MySQL-5.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut Problème avec une requete
    Bonjour,

    Je développe une application pour la gestion des congés, ou l'on me demande pour une unité (ou un service) les congés des personnes appartenant à cette unité de du mois de juin à mai de l'année n+1

    J'ai créée cette requête qui est presque bonne. L'exemple ici utilisé est pour l'unité numéro 1 et la récupération des informations du mois de juin 2018 à mai 2019

    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
     
    select  moisdisp.idMois, moisdisp.idPers, moisdisp.nomMois, moisdisp.annee, moisdisp.totalTravMois, moisdisp.nbCannuel,  
    moisdisp.nbCt, moisdisp.nbFerie, moisdisp.nbMaladie, moisdisp.nbCancien, moisdisp.nbRecup,  
    moisdisp.nbExcep, moisdisp.nbFamil, moisdisp.totalTravAfaire, moisdisp.ecart, moisdisp.nbHeureSuppPaye,  moisdisp.nbFormation, moisdisp.nbRecupFerie,  
    moisdisp.nbDelegation, moisdisp.nbIntemperie, moisdisp.nbSolidarite, moisdisp.nbEnfantMalade, moisdisp.nbNonJustif, moisdisp.nbSoldeCPaye, moisdisp.nbSoldeCAnciennete,  
    moisdisp.nbSoldeCTrimestriel     
    from Moisdisp as moisdisp, Personne as personne, Uniteservice as uniteservice, Unite as unite  
    WHERE personne.idService = uniteservice.idservice
    AND uniteservice.idUnite = unite.idUnite
    AND moisdisp.idPers = personne.idPersonne
    and unite.idUnite =  1
    and ( moisdisp.nomMois = 06 or  moisdisp.nomMois = 07 or  moisdisp.nomMois = 8 or  moisdisp.nomMois = 9 or  moisdisp.nomMois = 10 or  moisdisp.nomMois = 11 or  moisdisp.nomMois = 12 )  
     
    and moisdisp.annee = 2018 
     
    or (moisdisp.nomMois = 01 or  moisdisp.nomMois = 02 or  moisdisp.nomMois = 03 or  moisdisp.nomMois = 04 or  moisdisp.nomMois = 05  ) 
    and moisdisp.annee = 2019   and unite.idUnite =  1
    GROUP BY moisdisp.idmois
     
    ORDER BY moisdisp.idPers, moisdisp.annee, moisdisp.nomMois ASC
    Le soucis que j'ai et que j'obtiens les bonnes informations du mois de juin à décembre 2018. Par contre, pour la suite de la requete, j'obtiens les informations des personnes travaillant dans les autre unité U_U

    Pourriez vous m'aider s'il vous plait ?

    Je vous en remercie d'avance

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    il vous manque des parenthèses dans les conditions.

    condition1 AND condition2 OR condition3, sans parenthèses, est équivalent à (condition1 AND condition2) OR condition3.

    Par ailleurs, notez que
    and ( moisdisp.nomMois = 06 or moisdisp.nomMois = 07 or moisdisp.nomMois = 8 or moisdisp.nomMois = 9 or moisdisp.nomMois = 10 or moisdisp.nomMois = 11 or moisdisp.nomMois = 12 ),
    peut s'écrire plus simplement
    and moisdisp.nomMois = IN (6 ,7, 8,9 ,10, 11 ,12 ) ,
    ou même dans le cas présent
    and moisdisp.nomMois BETWEEN 6 AND 12 ,
    puisqu'il s'agit d'entier, voire même
    and moisdisp.nomMois > 5,
    car il est peu probable que vous ayez des mois supérieurs à 12

    De plus, cela fait plus de 25 ans que les jointure s’écrivent avec l'opérateur JOIN.

    Enfin, je ne comprend pas le GROUP BY, qui est incorrect en plus d'être inutile (aucune fonction d'agrégation n'est utilisée dans la requête)
    Si le but est de dédoublonner les résultats, utilisez plutôt DISTINCT, mais je ne pense pas que cela soit nécessaire ici


    votre requête devient donc :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    SELECT moisdisp.idMois,
           moisdisp.idPers,
           moisdisp.nomMois,
           moisdisp.annee,
           moisdisp.totalTravMois,
           moisdisp.nbCannuel,
           moisdisp.nbCt,
           moisdisp.nbFerie,
           moisdisp.nbMaladie,
           moisdisp.nbCancien,
           moisdisp.nbRecup,
           moisdisp.nbExcep,
           moisdisp.nbFamil,
           moisdisp.totalTravAfaire,
           moisdisp.ecart,
           moisdisp.nbHeureSuppPaye,
           moisdisp.nbFormation,
           moisdisp.nbRecupFerie,
           moisdisp.nbDelegation,
           moisdisp.nbIntemperie,
           moisdisp.nbSolidarite,
           moisdisp.nbEnfantMalade,
           moisdisp.nbNonJustif,
           moisdisp.nbSoldeCPaye,
           moisdisp.nbSoldeCAnciennete,
           moisdisp.nbSoldeCTrimestriel
    FROM	   Moisdisp AS moisdisp
    INNER JOIN      Personne AS personne
        ON			moisdisp.idPers = personne.idPersonne
    INNER JOIN	 Uniteservice AS uniteservice
        ON			personne.idService = uniteservice.idservice
    INNER JOIN      Unite AS unite
        ON			uniteservice.idUnite = unite.idUnite
    WHERE   unite.idUnite = 1
    AND (
        (moisdisp.annee = 2018   AND    moisdisp.nomMois > 5) --> les parenthèses sur cette ligne sont superflues, mais permettent une lecture plus aisée
        OR
        (moisdisp.annee = 2019   AND    moisdisp.nomMois < 6)--> les parenthèses sur cette ligne sont superflues, mais permettent une lecture plus aisée
    )
    ORDER BY moisdisp.idPers,
             moisdisp.annee,
             moisdisp.nomMois ASC
    ;

  3. #3
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Merci infiniment

    Grace à vous je viens d'apprendre plein de truc. Merci !!!!!!!!!

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

Discussions similaires

  1. mysql - problème avec une requete ajout
    Par mekongboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 18h17
  2. problème avec une requete utilisant LIMIT
    Par kow_Ced dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 16h01
  3. problème avec une requete
    Par PAYASS59 dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/03/2006, 13h12
  4. Problème avec une requete SQL sous access
    Par Luther13 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 14/12/2005, 10h39
  5. [debutant]Problème avec une requete ....
    Par MichMich29 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/07/2005, 17h19

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