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 requète trop selective


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2005
    Messages : 39
    Points : 19
    Points
    19
    Par défaut Problème requète trop selective
    Bonjour,

    Je suis en train de faire (du moins j'essaie !!) une requete pour exporter des données calculées pour "gérer" la paye d'une petite association :

    J'ai les tables personnel, heure_a_payer et reunion (j'ai simplifié au maximum)

    Je voudrai sortir pour chaque personnel et par date, l'addition des heures de reunion + les heures qui doivent etre payées (heure_a_payer), donc voici ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT (heure_a_payer.heure+reunion.heure)
    FROM personnel, heure_a_payer, reunion
    WHERE personnel.id_personnel=heure_a_payer.id_personnel
    AND personnel.id_personnel=reunion.id_personnel
    AND heure_a_payer.date=reunion.date
    Le probleme c'est que si je n'ai pas de reunion, le nom du personnel ne s'affiche pas, c'est logique mais comment faire ?

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Je vous conseille de passer de la syntaxe SQ1 (198x) à (au moins) la syntaxe SQL2(1999) (on en est à la 3 depuis 2002) et utiliser des jointures internes dans un premier temps.

    Votre requête deivent plus claire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT (heure_a_payer.heure+reunion.heure)
    FROM personnel
    INNER JOIN heure_a_payer 
            ON personnel.id_personnel=heure_a_payer.id_personnel
    INNER JOIN reunion
            ON personnel.id_personnel=reunion.id_personnel
          AND heure_a_payer.date=reunion.date
    Vous voulez inclure les personnes n'ayant pas fait de réunion.
    Si vous n'avez pas de réunion, alors oui, rien ne s'affiche pour cette personne car nous sommes dans le cas d'une jointure interne. Nous allons la remplacer par une jointure dite externe. Avec cette nouvelle syntaxe, cela devient très simple car seul un mot est à changer !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT (heure_a_payer.heure+reunion.heure)
    FROM personnel
    INNER JOIN heure_a_payer 
            ON personnel.id_personnel=heure_a_payer.id_personnel
    LEFT OUTER JOIN reunion
            ON personnel.id_personnel=reunion.id_personnel
          AND heure_a_payer.date=reunion.date

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2005
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Bon que dire de plus, mise à part PARFAIT .

    Merci beaucoup Alexandre T pour votre réponse qui est PARFAITE aussi !

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Petite remarque: il me semble qu'une opération mathématique où NULL apparait donne toujours NULL.
    Donc je conseille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT heure_a_payer.heure + IFNULL(reunion.heure, 0)

  5. #5
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Sivrît a parfaitement raison. le résultat d'une opération arithmétique contenant NULL retourne toujours NULL. Sa précision est très importante !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mysql> select 3 + NULL;
    +----------+
    | 3 + NULL |
    +----------+
    |     NULL |
    +----------+
    1 row in set (0.02 sec)

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

Discussions similaires

  1. Problème requête SQL select * from( select )
    Par yacinew dans le forum Paradox
    Réponses: 1
    Dernier message: 12/04/2015, 07h15
  2. [AC-2013] Problème requête ajout/select en VBA
    Par Defaultuser01 dans le forum VBA Access
    Réponses: 11
    Dernier message: 24/05/2014, 03h55
  3. Problème Requête SQL SELECT
    Par Burton's91 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/06/2012, 19h18
  4. [SQL] Problème requête SELECT
    Par dolf13 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 04/07/2006, 23h54
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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