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 SELECT avec jointure sur deux tables


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Requête SELECT avec jointure sur deux tables
    Bonjour à tous,

    Navrer pour le titre pas vraiment explicite, mais je vais vous exposer mon problème.

    J’ai deux tables :

    Une table « users » qui contient toutes les informations des utilisateurs et des techniciens.

    (Info : un technicien est un utilisateur avec plus de droits)

    Cette table a les champs suivant : ID ; name ; pwd ; email etc…

    Et

    Une table « tracking » qui contient toutes les informations des interventions demander par les utilisateurs et résolue par les techniciens.

    Cette table a les champs suivant : ID ; date ; closedate ; author ; assign etc…

    Le champ « author » contient le numéro id de la table « users » (info : ici c’est l’ID des utilisateurs)
    Le champ « assign » contient également le numéro id de la table « users » (info : c’est l’ID des techniciens)

    J’ai besoin de faire une requête SQL qui m’affiche au final un tableau avec :

    ID d’intervention ; demandeur ; technicien ; date de demande ; date de clôture ; durée d’intervention

    Actuellement j’arrive à afficher avec une requête SELECT la totalité du tableau sauf la colonne TECHNICIEN.

    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 	`glpi_tracking`.`id` AS `ID d'intervention`, 
    	`glpi_users`.`name` AS `Demandeur`, 
    	`glpi_tracking`.`date` AS `Date d'ouverture`, 
    	`glpi_tracking`.`closedate` AS `Date de fermeture`, 
    	TIMEDIFF(`closedate`, `date`) AS `Durée`
    FROM 	`glpi_users`, `glpi_tracking`
    WHERE 	`glpi_tracking`.`author` = `glpi_users`.`ID`
    Ou sinon j’arrive à avoir l’inverse cet à dire, à afficher la totalité du tableau sauf la colonne demandeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 	`glpi_tracking`.`id` AS `ID d'intervention`, 
    	`glpi_users`.`name` AS `Technicien`, 
    	`glpi_tracking`.`date` AS `Date d'ouverture`, 
    	`glpi_tracking`.`closedate` AS `Date de fermeture`, 
    	TIMEDIFF(`closedate`, `date`) AS `Durée`
    FROM 	`glpi_users`, `glpi_tracking`
    WHERE 	`glpi_tracking`.` assign ` = `glpi_users`.`ID`
    Le problème c’est que la requête suivante me donne un résultat avec la colonne Technicien et demandeur identique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 	`glpi_tracking`.`id` AS `ID d'intervention`, 
    	`glpi_users`.`name` AS `Technicien`, 
    	`glpi_users`.`name` AS `Demandeur`, 
    	`glpi_tracking`.`date` AS `Date d'ouverture`, 
    	`glpi_tracking`.`closedate` AS `Date de fermeture`, 
    	TIMEDIFF(`closedate`, `date`) AS `Durée`
    FROM 	`glpi_users`, `glpi_tracking`
    WHERE 	`glpi_tracking`.`author` = `glpi_users`.`ID`
    AND 	`glpi_tracking`.`assign` = `glpi_users`.`ID`
    Comment puis-je formuler ma requête pour que je puisse avoir les techniciens qui ont résolu l’intervention dans une colonne et les demandeurs qui ont posté l’intervention dans une autre colonne ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    En écrivant les jointures avec une syntaxe normalisée (INNER JOIN ... ON ...), ça devient plus simple de réaliser une telle requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT     t.`id` AS `ID d'intervention`, 
        u1.`name` AS `Technicien`, 
        u2.`name` AS `Demandeur`, 
        t.`date` AS `Date d'ouverture`, 
        t.`closedate` AS `Date de fermeture`, 
        TIMEDIFF(t.`closedate`, t.`date`) AS `Durée`
    FROM     `glpi_tracking` t
    INNER JOIN `glpi_users` u1 ON t.`assign` = u1.`ID`
    INNER JOIN `glpi_users` u2 ON t.`author` = u2.`ID`
    Il faut arrêter d'écrire les jointures avec des virgules et la condition de jointure dans la clause WHERE, et on comprend ensuite bien mieux ce qu'on fait

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Il va falloir arriver à créer un mouvement de lutte contre les jointures implicites

    Le pire c'est que c'est comme ça que les jointures sont enseignées par les profs dans les écoles
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Effectivement c’est plus simple et plus compréhensif avec un (INNER JOIN ... ON ...).
    Mais comme la dit Sevyc64 les jointures sont enseignées avec les clauses WHERE dans les écoles. Du moins c’est comme ça que j’ai appris.

    En tout cas merci a toi Ced pour ta réponse rapide et pertinente.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Points : 44
    Points
    44
    Par défaut
    J'ai appris le sql sous access il y 2 ans avec un thésard et j'ai aussi appris avec "where".
    J'ai des doute sur le fait que ça change bientôt :s .

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    D'autant que, à mon grand désappointement, j'ai appris par un ami qui travaille avec DB2, que dans ce SGBD ce serait l'optimiseur qui transformerait les jointures implicites en jointures normalisées.
    Ça m'a fort surpris mais il avait l'air sûr de son coup.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par Dr Rodney Mckay Voir le message
    J'ai appris le sql sous access il y 2 ans avec un thésard et j'ai aussi appris avec "where".
    J'ai des doute sur le fait que ça change bientôt :s .
    Et beh... Pour apprendre le SQL, il y a quand même des outils plus normalisés que Access ...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/03/2012, 10h31
  2. Delete avec jointure sur deux tables
    Par cecilebh dans le forum SQL
    Réponses: 10
    Dernier message: 28/03/2011, 17h10
  3. Requête select avec jointure sur des enregistrements inexitant.
    Par faistoiplaisir dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2009, 17h36
  4. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  5. [c#]commande Select avec jointure de deux tables
    Par chorokari dans le forum Accès aux données
    Réponses: 6
    Dernier message: 18/10/2006, 14h47

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