Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 16h43   #1
elgeek
 
Inscription : octobre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 33
Points : -2
Points : -2
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
elgeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 18h32   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 659
Points : 25 573
Points : 25 573
Envoyer un message via MSN à CinePhil
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h15   #3
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h32   #4
tse_jc
Membre confirmé
 
Avatar de tse_jc
 
Homme Jean-Christophe THOMAS
Ingénieur développement logiciels
Inscription : août 2010
Messages : 162
Détails du profil
Informations personnelles :
Nom : Homme Jean-Christophe THOMAS
Âge : 41
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 : 162
Points : 291
Points : 291
Envoyer un message via MSN à tse_jc Envoyer un message via Skype™ à tse_jc
Bonjour,

Citation:
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?
tse_jc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h30   #5
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 659
Points : 25 573
Points : 25 573
Envoyer un message via MSN à CinePhil
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h49   #6
tse_jc
Membre confirmé
 
Avatar de tse_jc
 
Homme Jean-Christophe THOMAS
Ingénieur développement logiciels
Inscription : août 2010
Messages : 162
Détails du profil
Informations personnelles :
Nom : Homme Jean-Christophe THOMAS
Âge : 41
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 : 162
Points : 291
Points : 291
Envoyer un message via MSN à tse_jc Envoyer un message via Skype™ à tse_jc
Je pense que tout est dit
__________________
_______________________________________
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
tse_jc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 22h04   #7
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h09.


 
 
 
 
Partenaires

Hébergement Web