Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Discussion: Aide requête inverse

  1. #1
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 33
    Points : 4
    Points
    4

    Par défaut Aide requête inverse

    Bonjour à tous,

    J'ai 3 tables :

    Utilisateurs (id,nomprenom)
    Groupe(id,intitule)
    Groupe Utilisateurs(id,idutilisateur,idgroupe)

    Je cherches à obtenir tout les utilisateur qui n'appartienne pas au groupe ayant pour id=2.

    Je pensais à l'instruction MINUS, mais elle ne fonctionne pas en MYSQL...?

    J'arrives bien à obtenir tout les utilisateur ayant le groupe 2 :
    Code :
    1
    2
    3
    4
    SELECT * 
    FROM Utlisateurs U,Groupe G,GroupeUtilisateurs GU 
    WHERE U.id=Gu.idutilisateur 
      AND G.id=GU.idgroupes
    Mais je n'arrives pas à obtenir l'inverse quel(s) solutions s'offrent à moi


    Merci

  2. #2
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 790
    Points : 23 025
    Points
    23 025

    Par défaut

    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

    2) Évitez de relancer la guerre des étoiles !

    3) La table GroupeUtilisateurs est une table associative entre les groupes et les utilisateurs. Sa clé primaire devrait être composée du couple {idutilisateur,idgroupe} ; l'id est inutile.

    4) Les tables et colonnes devraient être nommées au singulier, pas au pluriel.

    Vous recherchez les utilisateurs pour lesquels il n'existe pas de ligne dans la table GroupeUtilisateurs pour cet utilisateur associé au groupe 2.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT u.id, u.nom, u.prenom
    FROM Utilisateurs u
    WHERE NOT EXISTS
    (
    	SELECT 1
    	FROM GroupeUtilisateurs gu
    	WHERE gu.idutilisateur = u.id
    		AND gu.idgroupes = 2
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2011
    Messages : 1 894
    Points : 2 980
    Points
    2 980

    Par défaut

    salut,

    déjà une bonne pratique jamais * si tu fais une jointure, ensuite les jointures s'écrivent depuis 1992 avec l'opérateur join...

    la requête est simple:
    Code sql :
    1
    2
    3
    4
    SELECT u.nomprenom
    FROM utilisateurs u
    INNER JOIN GroupeUtilisateurs gu
      ON gu.idutilisateur=u.id AND gu.idgroupes<>2

    pour obtenir l'inverse: tous les utilisateurs qui sont dans le groupe ayant l'id=2:
    Code sql :
    1
    2
    3
    4
    SELECT u.nomprenom
    FROM utilisateurs u
    INNER JOIN GroupeUtilisateurs gu
      ON gu.idutilisateur=u.id AND gu.idgroupes=2

    si tu as besoin de récupérer le nom du groupe ce n'est qu'une jointure supplémentaire

    un petit truc si tu mets idgroupes, il serait logique de mettre alors idutilisateurs... en gros pluriel ou singulier il faut choisir

    perso, je ne suis pas fan des clés primaires multi-colonnes car si tu recherches dans un index multi-colonnes sur une ou des colonnes dont la première n'est pas utilisée dans le test, logiquement l'index est ignoré et c'est un fullscan... non?

    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Membre éclairé Avatar de tse_jc
    Homme Profil pro Jean-Christophe THOMAS
    Ingénieur développement logiciels
    Inscrit en
    août 2010
    Messages
    251
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Christophe THOMAS
    Âge : 42
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : août 2010
    Messages : 251
    Points : 397
    Points
    397

    Par défaut

    Bonjour,

    perso, je ne suis pas fan des clés primaires multi-colonnes car si tu recherches dans un index multi-colonnes sur une ou des colonnes dont la première n'est pas utilisée dans le test, logiquement l'index est ignoré et c'est un fullscan... non?
    C'est vrai uniquement si le seul index disponible est un index couvrant.

    Mes meilleurs voeux 2013
    _______________________________________
    POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?

  5. #5
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 790
    Points : 23 025
    Points
    23 025

    Par défaut

    Citation Envoyé par ericd69
    perso, je ne suis pas fan des clés primaires multi-colonnes car si tu recherches dans un index multi-colonnes sur une ou des colonnes dont la première n'est pas utilisée dans le test, logiquement l'index est ignoré et c'est un fullscan... non?
    La bonne pratique est de faire une clé primaire double + un index simple sur la deuxième colonne. Bien sûr, si c'est une clé primaire triple, quadruple... poser un index sur chaque colonne à partir de la deuxième. D'ailleurs, c'est même obligatoire puisque, en principe, une clé primaire multi-colonnes dans une table associative est composée de clés étrangères qui, par définition, doivent être indexées.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  6. #6
    Membre éclairé Avatar de tse_jc
    Homme Profil pro Jean-Christophe THOMAS
    Ingénieur développement logiciels
    Inscrit en
    août 2010
    Messages
    251
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Christophe THOMAS
    Âge : 42
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : août 2010
    Messages : 251
    Points : 397
    Points
    397

    Par défaut

    Je pense que tout est dit
    _______________________________________
    POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?

  7. #7
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2011
    Messages : 1 894
    Points : 2 980
    Points
    2 980

    Par défaut

    là c'est mieux oui
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •