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 :

Personnes n'ayant pas de matériel


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut Personnes n'ayant pas de matériel
    Bonjour

    J ai une table employee (am_employee) et une table materiel (am_asset)
    Je voudrais connaître les personnes n ayant pas de materiel comment faire
    Le champ de rapprochement est le employee.id

    J’ai fait sa mais je n ai pas des utilisateurs avec un champ materiel vide en face
    Pouvez vous m’aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select am_employee. last_name, am_asset.asset_tag 
    from am_employee 
    inner join am_asset on am_employee.employee_id = am_asset.employee_id

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Même problématique (et donc même solution) qu'ici :
    http://www.developpez.net/forums/d90...leme-jointure/

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser un LEFT OUTER JOIN au lieu du INNER JOIN.
    Si vous voulez uniquement ceux qui n'ont pas de correspondance, vous pouvez ajouter une condition de nullité ou passer par un NOT EXISTS.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    INNER JOIN = jointure interne.
    Ça signifie que les lignes gardées par la jointure seront seulement celles qui satisfont la condition de jointure située après le ON.

    Je voudrais connaître les personnes n ayant pas de materiel
    Il faut faire une jointure externe (OUTER JOIN) qui va retenir toutes les lignes d'une des deux tables (soit celle de gauche avec LEFT OUTER JOIN, soit celle de droite avec RIGHT OUTER JOIN) et afficher NULL pour les colonnes de la deuxième table quand une ligne de la première n'aura pas de correspondance dans la deuxième. Il suffit ensuite de ne garder que les lignes ayant NULL pour la deuxième table.

    En SQL, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT am_employee.last_name 
    FROM am_employee 
    LEFT OUTER JOIN am_asset ON am_employee.employee_id = am_asset.employee_id
    WHERE am_asset.employee_id IS NULL
    EDIT :
    Quand on prend le temps de bien expliquer on se fait griller !

  5. #5
    Membre régulier Avatar de Doracle
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Points : 74
    Points
    74
    Par défaut
    Sinon la seconde solution est de directement afficher les noms des personnes qui n'ont pas de matériel, donc il n'y a pas a chercher dans les résultats ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT last_name 
    FROM am_employee 
    WHERE  employee_id NOT IN (SELECT employee_id FROM am_asset)

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Ah super , merci beaucoup
    Comment faire pour dire que un utilisateur à moins de 3 materiels

    Merci beaucoup

  7. #7
    Membre régulier Avatar de Doracle
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Points : 74
    Points
    74
    Par défaut
    Pour une personne qui a moins de 3 matériels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT last_name 
    FROM am_employee 
    WHERE  employee_id IN (SELECT employee_id,count(materiel) 
                                     FROM am_asset
                                     GROUP BY employee_id
                                     HAVING count(materiel) < 3;)
    Remplace bien "materiel" par le champ adéquat.
    J'ai quand même un petit doute, vérifie.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Merci sa a fonctionner de dieux !
    J'en ai une derniere
    Comment faire apparaitre les personnes et les materiels dont la localisation du materiel et differente de la localisation de l'utilisateur

    En sachant que dans la table am_employee , la loca es treprésente par location_id et dans la table am_asset location_id

    Merci de votre aide

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Cette fois on retourne en jointure interne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT e.last_name, a.asset_tag
    FROM am_employee AS e
    INNER JOIN am_asset AS a ON a.employee_id = a.employee_id
    WHERE a.location_id <> e.location_id

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Merci
    Mais pour cette dernière requète , elle tourne en boucle et ne s'arrete pas

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ai-je mal interprété la signification des noms de colonnes ?
    A toi de voir pour adapter avec les bons noms mais il me semble pourtant que ma requête répond à ton besoin. En gros, je traduis le SQL :
    Sélectionner le 'last_name' de l'employé et l'asset-tag de la table am_asset (c'est bien le matériel ?)
    de la table des employés
    jointe avec la table am_asset sur l'égalité de la colonne employee_id
    la location_id d'une table est différente de celle de l'autre table.
    La colonne location_id est indexée dans les deux tables ?
    La colonne employee_id est indexée dans la table am_asset ?

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Merci de ta réponse
    Oui pour tes deux questions

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Bonjour

    J’ai deux champs de type date
    Prenons le champ 1 ( date dinventaire physique ) et champ 2 ( date d’inventaire automatique)
    Je voudrai afficher les biens materiels mais uniquement quand le delai entre les deux est de 10 jours .
    Comment je peux effectuer cette soustraction avec les deux champs de type dates
    merci

Discussions similaires

  1. [MySQL] Clients n'ayant pas commandé depuis n mois
    Par sdelaunay dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 08/07/2006, 13h26
  2. Inclure des images n'ayant pas le format .eps
    Par c-top dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 19/02/2006, 16h03
  3. Réponses: 14
    Dernier message: 25/11/2005, 14h22
  4. comment associer 3 tables n'ayant pas de champs communs ?
    Par bertrand_declerck dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/09/2005, 12h48
  5. recherche enregistrements n'ayant pas de correspondance
    Par fredonzenet dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/08/2005, 17h33

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