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 :

NATURAL JOIN SQL


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut NATURAL JOIN SQL
    Bonjour,

    J'essaie d'utiliser "NATURAL JOIN" voici ma requète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *   from attribuer NATURAL JOIN (personnel)
                order by attribuer.id_aff desc
    la table "attribuer" :id_perso id_aff nb_heures
    la table "personnel" : id_perso nom_perso prenom

    (donc ça se joint naturellement via le champ id_perso)

    le code php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    echo " <font class=red><b>ID : ".$data["id_aff"]."&nbsp;</b></font><b> ".$data["etat"]."&nbsp;</b>
    <form action=./../modifier/pre_modif.php method=post >
                        <input type=hidden name=id_aff  value= ".$data['id_aff']." >
                        <input class=bouton type=submit name=envoie value=Ouvrir >
                    </form>
    <b> Agent :</b> ".$data["prenom"]." ".$data["nom_perso"]."  <sup>".$data["id_perso"]."</sup>
     &nbsp  &nbsp <font class=mar><b>Heures</b> : ".$data["nb_heures"]."</font>
      &nbsp  &nbsp <font class=vert><b>description</b> : ".$data["desc"]."</font>
    ça marche, avec parfois des doublons, cad par exemple ça va m'afficher

    ID 1994 Agent : Michel ATBA 31 Heures : 12 description : toto
    ID 1993 Agent : Michel ATBA 31 Heures : 1 description : titi
    ID 1993 Agent : Michel ATBA 31 Heures : 3 description : titi

    Que dois-je rajouter pour éviter ça, cad dans l'exemple avoir ce qui suit : ?

    ID 1994 Agent : Michel ATBA 31 Heures : 12 description : toto
    ID 1993 Agent : Michel ATBA 31 Heures : 4 ( 1+3) description : titi

    (sachant que ID 1994 et 1993 correspond à l'ID_aff qui ne correspond qu'à une seule affaire)


    Cordialement,
    Philippe Rivière

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    J'essaie d'utiliser "NATURAL JOIN"
    Mauvaise idée !
    Il vaut mieux écrire les jointures clairement pour qu'on sache immédiatement sur quelle(s) colonne(s) faire la jointure.
    Imaginons, pour reprendre votre exemple, que plus tard vous ajoutiez à la table "personnel" une colonne "nb_heures" qui contiendrait l'horaire hebdomadaire de travail de chaque membre du personnel et votre NATURAL JOIN fera la jointure sur les deux colonnes, ce qui changera complètement le résultat de la requête.

    ça marche, avec parfois des doublons, cad par exemple ça va m'afficher

    ID 1994 Agent : Michel ATBA 31 Heures : 12 description : toto
    ID 1993 Agent : Michel ATBA 31 Heures : 1 description : titi
    ID 1993 Agent : Michel ATBA 31 Heures : 3 description : titi

    Que dois-je rajouter pour éviter ça, cad dans l'exemple avoir ce qui suit : ?

    ID 1994 Agent : Michel ATBA 31 Heures : 12 description : toto
    ID 1993 Agent : Michel ATBA 31 Heures : 4 ( 1+3) description : titi
    Vous cherchez donc à totaliser le nombre d'heures par affaire et par agent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_perso, id_aff,
    	SUM(nb_heures) AS nb_heures_total
    FROM attribuer
    GROUP BY id_perso, id_aff
    On fait ensuite la jointure de cette requête avec la table personnel pour récupérer les informations voulues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p.id_perso, p.nom_perso, p.prenom,
    	tmp.id_aff, tmp.nb_heures_total
    FROM personnel p
    INNER JOIN
    (
    	SELECT id_perso, id_aff,
    		SUM(nb_heures) AS nb_heures_total
    	FROM attribuer
    	GROUP BY id_perso, id_aff
    ) tmp ON tmp.id_perso = p.id_perso
    ORDER BY p.nom_perso, p.prenom, tmp.id_aff
    EDIT :
    À la réflexion, on peut faire plus simplement sans sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.id_perso, p.nom_perso, p.prenom,
    	a.id_aff,
    	SUM(a.nb_heures) AS nb_heures_total
    FROM personnel p
    INNER JOIN attribuer a ON a.id_perso = p.id_perso
    GROUP BY p.id_perso, p.nom_perso, p.prenom, a.id_aff
    ORDER BY p.nom_perso, p.prenom, a.id_aff
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut
    Merci pour ta réponse CinePhil, cela m'a beaucoup aidé.

    Je vais ouvrir un nouveau poste pour apprendre à rajouter une table sans pb d'ambiguïté de requête.

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

Discussions similaires

  1. impossibilité d'enchaîner les NATURAL JOIN
    Par ctobini dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/09/2006, 17h24
  2. INNER JOIN , NATURAL JOIN : quelle différence?
    Par cladsam dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2006, 17h05
  3. NATURAL JOIN imbriqués
    Par papy_tergnier dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/01/2006, 10h37
  4. [Debutant][Join Sql] problème de join
    Par ultimax dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h01
  5. Requête avec NATURAL JOIN
    Par blids dans le forum SQL
    Réponses: 4
    Dernier message: 06/08/2004, 11h52

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