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 :

BDL - Symfony Request


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Par défaut BDL - Symfony Request
    Bonjour,
    Je fais du DQL sous Symfony 4.2
    J'ai la requête suivante, qui fonctionne:

    Code php : 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
        public function findEtudiantPasPointer($em, $idCours, $idDate, $idCreneau)
        {
          $query = $em->createQuery("
          SELECT u.nomUtilisateur, u.prenomUtilisateur, u.id AS ec_id
          FROM App\Entity\EtudiantCours ec
          LEFT JOIN App\Entity\Pointage po WITH ec.etudiant = po.utilisateurEtudiant
          JOIN App\Entity\Utilisateur u WITH po.utilisateurEtudiant = u.id
          JOIN App\Entity\CoursPlanning cp WITH po.cours = cp.id
          WHERE cp.cours = :idCours
          AND cp.plageHoraire = :idCreneau
          AND cp.dateCours = :idDate
          ")
          ->setParameter('idCours', $idCours)
          ->setParameter('idDate', $idDate)
          ->setParameter('idCreneau', $idCreneau);
     
          $result  = $query->getResult();
          return $result;
        }
    Elle me retourne 2 résultats.

    Je voudrai que cette requête me retourne la différence des entrées entre "EtudiantCours" et "Pointage".
    En claire, Pointage retrace les pointages des étudiants et "EtudiantCours" et retrace les élèves inscrits. Je veux savoir quels élèves inscrits n'ont pas pointé. Soit :
    Quels sont les id de la table ec.etudiant qui ne sont pas présent dans po.utilisateurEtudiant? Pourquoi mon LEFT JOIN ne suffit pas ? (un JOIN normal me donne le même résultat).
    Merci d'avance!

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 443
    Par défaut
    Bonjour,
    Je ne connais pas DQL (j'ai au début cru à une faute de frappe, mais le with dans la jointure monte que non), mais visiblement ça fonctionne peu ou prou comme du SQL.
    Tu as mis une condition dans la clause WHERE sur la table PO, donc tu as implicitement transformé ta jointure externe en jointure interne.
    Il faut déplacer cette condition dans la jointure.

    Tatayo.

  3. #3
    Membre éclairé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Par défaut
    Hello!
    Oui tout à fait, le language est très similaire au SQL. Merci pour ta réponse, j'ai intégré la clause dans la jointure mais j'ai le même résultat pour le moment: j'ai les enregistrements des étudiants ayant pointé (po) et pas les enregistrement de ceux qui n'ont pas pointé (en gros "ec" moins "po", soit la différence des éléments présents sur "ec" et pas "po").
    J'ai tenté en adaptant mon code en SQL et en l'exécutant dans la console de PhpMyAdmin, j'ai le même résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          SELECT u.nom_utilisateur
          FROM etudiant_cours ec
          LEFT JOIN pointage po ON ec.etudiant = po.utilisateur_etudiant_id
          JOIN utilisateur u ON po.utilisateur_etudiant_id = u.id
          JOIN cours_planning cp ON po.cours_id = cp.id
          WHERE cp.cours = 63
          AND cp.plage_horaire_id = 75
          AND cp.date_cours = 1;
    J'ai utilisé ceci avec un exemple tiré de ma base, je suis censé avoir en retour 1 seul nom qui est dans "ec" mais pas dans "po", et à la place j'ai 2 noms, qui sont communs à ces 2 tables. une idée? merci
    PS: J'ai donc update mon post précédent avec les modifications. Travaillez avec la version que vous préférez si l'on corrige en SQL ça sera surement OK pour le DQL comme je trouve le même résultat.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 443
    Par défaut
    Si j'ai bien compris (le confinement n'aide pas ), tu veux exclure du résultat les lignes pour lesquelles il n'y a pas de correspondance avec po.
    Dans ce cas il faut juste modifier le WHERE
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... and po.utilisateur_etudiant_id is null
    C'est dommage que tu ais modifié ton premier message, du coup on ne comprend plus ma réponse (on ne voit plus la condition dans le where).

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    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 623
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Là encore, votre restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE cp.cours = 63
      AND cp.plage_horaire_id = 75
      AND cp.date_cours = 1;
    utilise des éléments de la table "cours_planning" qui est jointe à la table OUTER "pointage".
    Ce faisant, tout se passe comme si la jointure OUTER était une jointure INNER.

    Si vous voulez conserver une jointure OUTER et vérifier que l'étudiant de la table "etudiant_cours" est absent de la table "pointage" alors il faut utiliser une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       SELECT u.nom_utilisateur
       FROM   etudiant_cours ec
       left JOIN pointage po 
         ON po.utilisateur_etudiant_id = ec.etudiant
       inner JOIN utilisateur u 
         ON u.id = po.utilisateur_etudiant_id
       inner JOIN cours_planning cp 
         ON cp.id = po.cours_id
        and cp.cours = 63
        and cp.plage_horaire_id = 75
        and cp.date_cours = 1
       where po.utilisateur_etudiant_id is null
       ;

  6. #6
    Membre éclairé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2018
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2018
    Messages : 300
    Par défaut
    Merci pour vos 2 réponses!
    J'avais tenté aussi un IS NULL, sans résultat. Ta requête semble bonne et compatible avec mes tables, mais le résultat est vide :
    Nom : 1.png
Affichages : 247
Taille : 13,6 Ko
    Voici les tables utilisées par ma requête:
    cours_planning:
    Nom : 2.png
Affichages : 260
Taille : 41,7 Ko
    etudiant_cours:
    Nom : 3.png
Affichages : 246
Taille : 24,0 Ko
    pointage:
    Nom : 4.png
Affichages : 242
Taille : 25,3 Ko
    Et enfin, la table utilisateur:
    Nom : 5.png
Affichages : 228
Taille : 15,5 Ko
    Si vous avez une idée, je suis preneur!
    Merci encore, je continue en parallèle à creuser ça

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    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 623
    Billets dans le blog
    10
    Par défaut
    essayez avec cette syntaxe, souvent requise quand des combinaisons de jointure INNER et OUTER sont utilisées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       FROM   etudiant_cours ec         
       left JOIN pointage po 
           inner JOIN utilisateur u 
              on u.id = po.utilisateur_etudiant_id
           inner JOIN cours_planning cp 
              on cp.id = po.cours_id 
             and cp.cours = 63
             and cp.plage_horaire_id = 75
             and cp.date_cours = 1
         ON po.utilisateur_etudiant_id = ec.etudiant     -- critères de la jointure OUTER déportés ici 
       where po.utilisateur_etudiant_id is null
       ;

Discussions similaires

  1. [4.x] Symfony 4.3.3 Classe Request non trouvable
    Par ltatiekam dans le forum Symfony
    Réponses: 5
    Dernier message: 13/08/2019, 18h20
  2. [jsp]problème avec request.getParameter(...)!
    Par fadoua dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/09/2003, 13h26
  3. Envoyer un message icmp (Echo Request)
    Par ovdz dans le forum Développement
    Réponses: 5
    Dernier message: 19/06/2003, 14h14
  4. Request.RemoteAddr, Request.RemoteHost
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 6
    Dernier message: 19/03/2003, 13h43
  5. [XMLRAD] Décoder Request.Query
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 8
    Dernier message: 10/01/2003, 16h40

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