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 :

Jointure entre 3 tables


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut Jointure entre 3 tables
    Bonjour à tous,
    J'ai trois tables tasks( id, matricule, task, date), calendar (id, dt), emplye(id, matricule).
    Je souhaiterais afficher depuis ma liste d'employés les personnes ayant saisi les taches et ceux qui ne les ont pas saisi pendant les jours définis dans ma table calendar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select e.matricule from employe e
    inner join select c.dt, count(t.date) as counter
    from calendar c
    left join tasks t 
        on t.date = c.dt
    where c.dt >= current_date - interval 30 day and c.dt < current_date
    group by e.matricule
    mais ma requête de marche pas.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par hichamus13 Voir le message
    ma requête de marche pas.
    Peut-on avoir plus de détails ?
    Un message d'erreur ? Lequel ?
    Un résultat erroné ? Qu'est-ce qui était attendu ? Qu'est-ce qui est retourné ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    J'ai ce message d'erreur
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select c.dt, count(t.date) as counter\nfrom calendar c\nleft join tasks t \n ' at line 2

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    En fait, pour chaque employé de ma table employee, je souhaiterais compter le nombre de fois ou son matricule apparait dans la table "tasks" pendant les jours définis dans la table calendar.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    bonjour,

    il manque un alias pour la table dérivée et un prédicat de jointure
    De plus, les alias sur la colonne de restriction doivent également utiliser l'alias manquant pour la table dérivée.

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select e.matricule 
    from employe e
    inner join 
         (select c.dt
                , count(t.date) as counter
                , t.matricule
          from calendar c
          left join tasks t 
            on t.date = c.dt
         )as SUBQ
       on SUBQ.matricule = E.matricule
    where SUBQ.dt >= current_date - interval 30 day 
      and SUBQ.dt < current_date
    group by e.matricule

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci pour laréponse. Cela me donne un résultat vide

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    il manquait aussi un regroupement dans la requête corrélée, j'ai oublié de le rajouter :

    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
    select e.matricule 
         , subq.counter
    from employe e
    inner join 
         (select c.dt
                , count(t.date) as counter
                , t.matricule
          from calendar c
          left join tasks t 
            on t.date = c.dt
          group by c.dt
              , t.matricule
         )as SUBQ
       on SUBQ.matricule = E.matricule
    where SUBQ.dt >= current_date - interval 30 day 
      and SUBQ.dt < current_date
    group by e.matricule
    Cela dit, il y aurait dû y avoir un message d'erreur

    J'ai aussi ajouté le compteur dans la clause SELECTde la requête principale, puisque le but est de le récupérer

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Le résultat est toujours vide

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Exemple de jeu d'essai :

    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
    with EM_employe(EM_ident, EM_nom) as
        (select 1, 'dupont'  union all
         select 2, 'martin'  union all
         select 3, 'zorglub'
        )
       , CA_calendrier(CA_date) as
        (select '2020-01-03'   union all
         select '2020-01-06'   union all
         select '2020-01-07'   union all
         select '2020-01-09'
        )
       , TA_tache(TA_ident, TA_date, EM_ident) as
        (select 1, '2020-01-03', 1   union all
         select 2, '2020-01-03', 3   union all
         select 3, '2020-01-07', 1   union all
         select 4, '2020-01-09', 2   union all
         select 5, '2020-01-09', 2   
        )
    Avec cette 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
    select EM.EM_ident
         , EM.EM_nom
         , SUBQ.DTE
         , SUBQ.NBR
    from EM_employe EM
    inner join
         (select TA.EM_ident
               , TA.TA_date as DTE
               , count(*)   as NBR
          from TA_tache TA
          inner join CA_calendrier CA
             on CA.CA_date=TA.TA_date
          group by EM_ident
                 , TA.TA_date
         ) SUBQ
      on SUBQ.EM_ident=EM.EM_ident
    on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EM_ident	EM_nom	DTE	NBR
    1	dupont	2020-01-03	1
    1	dupont	2020-01-07	1
    2	martin	2020-01-09	2
    3	zorglub	2020-01-03	1
    C'est bien ce qui est attendu non ?

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Exactement,
    Je dois afficher les résultats en PHP comment ?

    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
     
    <td style="font-weight: bold;">matricule </td>
    <td style="font-weight: bold;">compteur </td>
    <td style="font-weight: bold;">date </td>
     
    ......
     
    <?php
    while($row = $requete->fetch()) {
     
                                   ?>
     
    <td><?php echo $row["matricule"]; ?></td>
    <td><?php echo $row["counter"]; ?></td>
    <td><?php echo $row["SUBQ.dt"]; ?></td>
                                   </tr>                
                          <?php }

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    pour les questions sur le PHP il vaut mieux poster ici : https://www.developpez.net/forums/f443/php/

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Est ce qu'il ya moyen d'afficher 0 pour les personnes n'ayant pas rempli de tâche pour une journée.
    Exemple dans votre exemple afficher 0 pour tous les utilisateurs à la date du 06 janvier ?

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

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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