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 :

Requête particulière, comment faire ?


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 72
    Points : 45
    Points
    45
    Par défaut Requête particulière, comment faire ?
    Bonjour à tous,

    Voilà je vais essayer de vous expliquer mon petit cas de figure sur lequel je me prends la tête. Je travaille sur une petite application qui permet de gérer des pointages.

    J’ai deux tables regroupant un certains nombre de champs dont ceux présentés ci-dessous :

    Pointage

    Id_pointage | id_user | semaine | temps | …….


    Users

    Id_user | nom | prenom | ………


    Mon souhait est de faire une requête qui me ressorte toutes les personnes n’ayant pas pointé 5 jours (temps) / semaine et ce pour toutes les semaines passées, avec un résultat sous la forme suivante :

    Id_user | semaine | temps


    J’ai donc crée la requête suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT semaine,id_user,SUM(temps) AS totalJ FROM pointage WHERE semaine<42
    GROUP BY id_user,semaine HAVING totalJ<5 ORDER BY id_user
    Le hic avec cette requête, c’est que seules les lignes des personnes ayant effectué au moins un pointage pour une semaine donnée apparaissent.

    Si par exemple l’id_user 1 n’a effectué aucun pointage pour la semaine 40, il n’apparaitra pas. Un peu embêtant pour une requête devant me donner toutes les personnes en retard de pointage. Par contre si il avait juste pointé 1 jour, il serait apparu.

    Alors j’ai essayé de modifier ma requête dans tous les sens, en créant une table semaine, en faisant de LEFT / RIGHT JOIN mais rien n’y fait, je ne m’en sors pas !

    Avez-vous une idée de comment je peux construire cette « foutu » requête !?

    Par avance grand merci pour votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 13
    Points : 22
    Points
    22
    Par défaut
    Premièrement, j'ai besoin d'une table "semaine" pour identifier les semaines possibles. Comme il n'y en a pas dans ton example je vais en faire une à partir de la table de pointage comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct semaine from pointage
    ensuite je genère un enregistrement de pointage "bidon" avec zéro heures pour chacun des users.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select u.id_user, p.semaine, 0 as temps
      from users u,
            ( select distinct semaine from pointage ) p
    j'ajoute ensuite les pointages "bidon" à table requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT semaine,id_user,SUM(temps) AS totalJ
      FROM (select u.id_user, p.semaine, 0 as temps
              from users u,
                   ( select distinct semaine from pointage ) p
            union all
            select id_user, semaine, temps from pointage
           ) point
     WHERE semaine<42
     GROUP BY id_user,semaine
     HAVING totalJ<5
     ORDER BY id_user
    Il y a peut-être des erreurs de syntaxe, je n'ai pas testé.

    Si ta table de pointage est volumineuse, tu devras sans doute faire une table de "semaine" pour aider la performance.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Comme l'a suggéré mmazerolle, il te faudrait une table des semaines car si personne n'a pointé par exemple durant la semaine 30, celle-ci n'apparaîtra pas et tu croiras que tout le monde a pointé !

    Ensuite, pour avoir à la fois toutes les semaines et tous les utilisateurs, il faut faire des jointures externes avec la table des pointages.

    Essaie un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT s.num_semaine, u.id_user, SUM(p.temps) AS totalJ
    FROM pointage AS p
    RIGHT OUTER JOIN semaine AS s ON s.num_semaine = p.semaine
    RIGHT OUTER JOIN user AS u ON u.id_user = p.id_user
    WHERE s.num_semaine < 42
    GROUP BY s.num_semaine, u.id_user
    HAVING SUM(p.temps) < 5
    ORDER BY u.id_user

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Avant toute chose, merci à vous deux pour votre aide.

    Alors pour ce qui est de la solution de mmazerolle, j'avais pensé à cette éventualité mais ça me posait des problèmes de devoir insérer de lignes avec un temps à 0 pour chacun des users / chacune des semaines, c'est pourquoi je cherchais à savoir si il était possible de faire autrement.

    Pour ce qui est de la solution de CinePhil, j'ai suivi vos indications en créant une table semaine (chose que j'avais déjà faite dans le cadre de mes essais) et en appliquant votre requête mais ça ne me retourne uniquement les semaines incomplètes. Si une personne n'a effectué aucune saisie pour une semaine donnée, aucune ligne n'apparait pour cette dernière....

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    J'avais lu dans un livre sur les entrepos de donnée que faire une table préremplie avec des dates croissante simultanement à l'autoincrement était une bonne chose. Dans le cas d'un entrepos, c'est vrai. Mais ensuite c'est extremement facile de faire un date_diff, et de résoudre ton probleme.

Discussions similaires

  1. Requête DISTINCT comment faire?
    Par Dr_No dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/03/2015, 17h51
  2. Requête inversée comment faire?
    Par rjcab dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/11/2008, 01h47
  3. [MySQL] Requête Mysql comment faire ?
    Par gerlougir dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 27/05/2007, 11h29
  4. Requêtes web: comment faire ?
    Par requin01 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 21/05/2006, 20h08
  5. Requête SQL complexe. Comment faire ....
    Par BilTCD dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/11/2004, 16h18

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