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, je n'y arrive pas


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 4
    Points
    4
    Par défaut Jointure, je n'y arrive pas
    Bonjour

    J'ai cherché mais je bloque.

    Je travaille sur cette jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlValue(" SELECT OBJET_PROJET FROM GES_PROJETS_HSE_PACTE_2324 LEFT JOIN GES_PROJETS_HSE_PACTE_2324 ON GES_DEMANDE_PACTE24H_2324.id = GES_PROJETS_HSE_PACTE_2324.PROJET_PACTE_24H WHERE GES_PROJETS_HSE_PACTE_2324.id'" . makeSafe($data['id']) . "'");
    Je m'explique:

    Table 1 GES_PROJETS_HSE_PACTE_2324 TABLE PARENT
    Contient les projets.

    Nom : Capture d’écran 2023-11-27 115411.jpg
Affichages : 98
Taille : 175,4 Ko


    Table 2 : GES_DEMANDE_PACTE24H_2324 TABLE ENFANTS
    Contient les déclarations des enseignants par rapport aux projets déposés (donc table au dessus)

    Nom : Capture d’écran 2023-11-27 115838.jpg
Affichages : 96
Taille : 108,4 Ko

    EX
    Projet FLEURS ds TABLE 1, le chef donne 24H
    L'enseignant déclare ses heurs tous les mois dans la TABLE 2 en sélectionnant le projet FLEURS

    J'ai ce code pour envoyer un émail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <h3>Important : MODIFICATION/VALIDATION fiche declaration PACTE 24H</h3>
    <hr>
    <table>
    <tr><td><b>NUMERO DE LA FICHE </td><td><?php echo sqlValue("select id from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>PORTEUR</td><td><?php echo sqlValue("select NOM from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>EMAIL PORTEUR</td><td><?php echo sqlValue("select HSE_EMAIL from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>MONTANT DEMANDE</td><td><?php echo sqlValue("select MONTANT_PACTE_24H from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>MOIS_HSE</td><td><?php echo sqlValue("select MOIS_HSE from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>OBJET :</td><td><?php echo sqlValue("select PROJET_PACTE_24H from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>OBJET 2 :</td><td><?php echo sqlValue(" SELECT OBJET_PROJET FROM GES_PROJETS_HSE_PACTE_2324 LEFT JOIN GES_PROJETS_HSE_PACTE_2324 ON GES_DEMANDE_PACTE24H_2324.id = GES_PROJETS_HSE_PACTE_2324.PROJET_PACTE_24H WHERE GES_PROJETS_HSE_PACTE_2324.id'" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>REMARQUES :</td><td><?php echo sqlValue("select REMARQUES from GES_DEMANDE_PACTE24H_2324 where id='" . makeSafe($data['id']) . "'"); ?></td></tr>
    <tr><td><b>AVIS notifié ultérieurement</td><td></td></tr>
    Mais cela me revient toujours avec l'ID et pas le texte.

    Nom : Capture d’écran 2023-11-27 120115.jpg
Affichages : 97
Taille : 30,7 Ko

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu as une erreur dans ta requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT OBJET_PROJET FROM GES_PROJETS_HSE_PACTE_2324 
    LEFT JOIN GES_PROJETS_HSE_PACTE_2324 
    	ON GES_DEMANDE_PACTE24H_2324.id = GES_PROJETS_HSE_PACTE_2324.PROJET_PACTE_24H 
    WHERE GES_PROJETS_HSE_PACTE_2324.id'" . makeSafe($data['id']) . "'"

    La table GES_DEMANDE_PACTE24H_2324 n'apparait que dans le critère de jointure.
    J'imagine qu'elle doit être à la place de GES_PROJETS_HSE_PACTE_2324 dans la jointure. Il manque également le = dans le WHERE.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT OBJET_PROJET FROM GES_PROJETS_HSE_PACTE_2324 
    LEFT JOIN GES_DEMANDE_PACTE24H_2324 
    	ON GES_DEMANDE_PACTE24H_2324.id = GES_PROJETS_HSE_PACTE_2324.PROJET_PACTE_24H 
    WHERE GES_PROJETS_HSE_PACTE_2324.id = '" . makeSafe($data['id']) . "'"

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 4
    Points
    4
    Par défaut
    Pour le = oui il avait sauté au copier coller merci !j'ai donc fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tr><td><b>OBJET 2 :</td><td><?php echo sqlValue("SELECT OBJET_PROJET FROM GES_PROJETS_HSE_PACTE_2324 LEFT JOIN GES_DEMANDE_PACTE24H_2324 ON GES_DEMANDE_PACTE24H_2324.id = GES_PROJETS_HSE_PACTE_2324.PROJET_PACTE_24H WHERE GES_PROJETS_HSE_PACTE_2324.id = '" . makeSafe($data['id']) . "'"); ?></td></tr>
    mais cela na va toujours pas, c'est pas mon fort !!!

  4. #4
    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 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Si c'est toujours ce symptôme qui persiste :
    Citation Envoyé par pasbonte38 Voir le message
    Mais cela me revient toujours avec l'ID et pas le texte.
    Alors la requête publiée n'est pas celle exécutée, puisque la requête publiée ne sélectionne qu'une seule colonne OBJET_PROJET de type "text"

    Si c'est un autre symptôme qui se produit, merci de le communiquer (message d'erreur complet s'il y a lieu, résultat obtenu...)

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Bonjour,

    Est-ce que la table secondaire « GES_DEMANDE_PACTE24H_2324 » contient bien des entrées correspondant à l'enregistrement concerné dans la table-mère ?

    Car ici, tu utilises une jointure naturelle et donc fermée « LEFT JOIN » si bien que si l'une des deux tables ne contient aucun enregistrement, le résultat n'en contiendra aucun non plus. Il faut au minimum utiliser une jointure ouverte si les entrées de la deuxième table sont facultatives, ou si elles sont insérées a posteriori au cours du temps, ce qui revient au même.

    En outre, à cette ligne, tu écris WHERE GES_PROJETS_HSE_PACTE_2324.id = '" . makeSafe($data['id']). Or, $data['id'] est l'id de la table GES_DEMANDE_PACTE24H_2324, pas GES_PROJETS… comme indiqué dans cette clause where. Ça veut dire que tu interroges une table avec un id qui n'est pas le sien. C'est comme si tu étais au bon numéro mais dans la mauvaise rue ! Tu risques d'obtenir sans la moindre erreur à l'écran des informations qui ne sont pas les bonnes !

    Je vois également que tu as pensé à poser une clé étrangère sur PROJET_PACTE_24H que tu indiques bien que c'est GES_PROJETS_HSE_PACTE_2324 qui est la table parente, ce qui laisse à penser que l'id doit bien appartenir à celle-ci et que, par conséquent, ce sont toutes les autres requêtes qui sont fausses.

    Enfin, et c'est là le plus important : tu relances une requête par champ, ce qui est une hérésie ! Il faut écrire une seule requête dans laquelle tu vas sélectionner tous les champs en une fois, en précisant leur table s'il y a des homonymes de chaque côté (sinon ce n'est pas nécessaire, mais toujours propre si tu utilises des alias courts) et écrire une seule jointure. Oublie totalement sqlValue() qui est un raccourci pour obtenir directement la valeur d'un champ quand il n'y en a pas d'autre.

    Code SQL : 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 t1.id,
                    t1.OBJET_PROJET,
     
                    t2.NOM,
                    t2.HSE_EMAIL,
                    t2.MOIS_HSE,
                    t2.PROJET_PACTE_24H,
                    t2.MONTANT_PACTE_24H,
                    t2.REMARQUES
     
               FROM GES_PROJETS_HSE_PACTE_2324 t1
     
    LEFT OUTER JOIN GES_DEMANDE_PACTE24H_2324 t2
                 ON t2.id = t1.PROJET_PACTE_24H
     
               WHERE t1.id= <ton id>

    Si tu travailles en PHP, utilises « fetch_assoc() » soit depuis l'API mysqli si c'est celle que tu utilises, soit depuis PDO si tu dois en choisir une. Cette fonction te retournera un tableau associatif qui contiendra tous les champs d'une ligne, repérés par le nom de colonne. Par exemple : $row["OBJET_PROJET"].

    Note enfin que par nature, si tu fais une jointure avec une table, il peut y avoir 0, 1 ou plusieurs entrées dans la deuxième table correspondant à une ligne de la première (donc un id). Cela signifie qu'il te faudra itérer (faire une boucle) sur l'appel en question et traiter les lignes une à une, jusqu'à ce que tu atteignes la fin.

    Bon courage.

  6. #6
    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 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    [. . .]
    Car ici, tu utilises une jointure naturelle et donc fermée « LEFT JOIN » si bien que si l'une des deux tables ne contient aucun enregistrement, le résultat n'en contiendra aucun non plus. Il faut au minimum utiliser une jointure ouverte si les entrées de la deuxième table sont facultatives, ou si elles sont insérées a posteriori au cours du temps, ce qui revient au même.
    il ne s'agit pas ici d'une jointure "naturelle" (NATURAL JOIN), mais d'une jointure "externe" (LEFT OUTER JOIN), le mot clef OUTER, facultatif, ayant ici été omis.
    Ce faisant, s'il existe des lignes dans la table de gauche, il y aura un résultat, même en l'absence de lignes dans la table de droite.

    Pour éviter de manipuler des noms de tables à rallonge, il serait préférable d'utiliser des alias parlants (plutôt que T1, T2, A, B...), la lecture de la requête en serait plus aisée :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GES_PROJETS_HSE_PACTE_2324  as PROJ
    GES_DEMANDE_PACTE24H_2324   as DEMD

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    il ne s'agit pas ici d'une jointure "naturelle" (NATURAL JOIN), mais d'une jointure "externe" (LEFT OUTER JOIN), le mot clef OUTER, facultatif, ayant ici été omis.
    Ce faisant, s'il existe des lignes dans la table de gauche, il y aura un résultat, même en l'absence de lignes dans la table de droite.
    En effet, j'ai confondu… J'ai dû poster un peu trop tard.

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 4
    Points
    4
    Par défaut Je vais étudier tout cela
    Bonjour

    je vais étudier toutes vos réponses, merci !

Discussions similaires

  1. Je n'arrive pas à faire ma requete avec jointure voulue
    Par yann123456 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/02/2009, 20h02
  2. Jointure avec trois tables, je n'y arrive pas.
    Par sunshine33 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/02/2007, 09h52
  3. Je n'arrive pas à détruire une fenêtre
    Par CORREGE Frédéric dans le forum MFC
    Réponses: 6
    Dernier message: 22/02/2004, 20h28
  4. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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