Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2011, 16h11   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 1
Points : 0
Points : 0
Par défaut select sur une relation n:n

Bonjour,

Je fais des sites internet à mes heures perdues (php-mysql) et je suis devant un problème que je n'arrive pas à résoudre.

J'ai 3 tables:
  • Personnes (idPers, nom,...)
  • competence (idComp, competence,...)
  • comp_pers (idPers, idComp)

Il y a une relation n:n entre les table personnes et comp_pers et également entre competence et comp_pers

Je désire sortir les personnes qui ont les compétences x, y et z.

Est-ce que quelqu'un pourrait m'aider s'il vous plait.
Merci d'avance
zoulou123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 16h28   #2
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Bonjour, ce que tu souhaites faire s'appelle une jointure.

Je t'invite à regarder la doc de MySQL pour voir les différents types de jointures (interne, externe à gauche, externe à droite, etc).


Dans ton cas, tu devrais avoir un truc du genre:
Code :
1
2
3
4
5
6
7
8
SELECT
    *
FROM Personnes p
    INNER JOIN comp_pers cp
        ON (p.idPers = cp.idPers)
    INNER JOIN competence c
        ON (cp.idComp = c.idComp)
WHERE c.competence IN (x, y, z)
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 16h38   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
La solution donnée n'est pas exacte, car elle ne répond pas a l'expression des besoins du demandeur ...

Code :
WHERE c.competence IN (x, y, z)
sera considéré comme un OR, mais il veut un AND !


Ce genre de requête peut vous aider, à tester et adapter !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT 
	c.idPers
FROM
	comp_pers c 
INNER JOIN
	competence e
ON
	(e.idComp = c.idcomp)
WHERE
	e.competence IN (x,y,z)
GROUP BY
	c.idPers
HAVING
	/* Vous pouvez Ecrire 
 
	   count(1) = 3 
 
	   Mais si vous essayez de faire une requete
	   generique, il est peut etre preferable de
	   passer par ce petit bout de code
 	*/
	count(1) = (
			SELECT 
				Count(1)
			FROM
				competence
			WHERE
				competence IN (x,y,z)
		   )
Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 21h24   #4
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Mea culpa, j'avais pas vu le ET
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2011, 03h45   #5
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 884
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 884
Points : 5 118
Points : 5 118
Bonsoir,


Comme dans le cas de rgomes, vous pourriez aussi paraphraser la division relationnelle :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT Nom
FROM   PERSONNE AS a
WHERE  NOT EXISTS
      (SELECT *
       FROM   COMPETENCE AS b
       WHERE  b.Competence IN (x, y, z)
       AND    NOT EXISTS
             (SELECT  *
              FROM    COMP_PERS AS c
              WHERE   a.IdPers = c.IdPers 
              AND     b.IdComp = c.IdComp
             )
      ) ;
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
=> La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h38.


 
 
 
 
Partenaires

Hébergement Web