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 :

Aide requête inverse


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 19
    Points
    19
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    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

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  6. #6
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Je pense que tout est dit

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    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...

Discussions similaires

  1. [MySQL] Aide requête MySQL : sélection aléatoire d'un enregistrement avec critère
    Par iwf-fr dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/05/2007, 10h01
  2. Aide requête SVP!
    Par manucha dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2007, 15h37
  3. Aide requète avec jointure
    Par StanmaD dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2006, 00h55
  4. Aide requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 18
    Dernier message: 14/09/2006, 22h31
  5. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 15h04

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