Problème de relation [Résolu]

Signaler
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
-
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006
-
Hello,

J'ai un problème et je ne trouve pas d'info pour m'aider, j'ai une base de données qui contient 7 tables InnoDB. Et je dois mettre c'est table en relation mais je sais pas comment on fait dans la pratique. Je comprend la théorie de 1à1 ou 1à plusieurs, ... Mais comment faire avec MySQL.

Si quelqu'un à un site ou un tuto qui peut m'aider se serait vraiment super.

Merci d'avance,

++

21 réponses

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Oui, j'ai assumé que c'était du n-n en fait.
1 utilisateur peut être lié à plusieurs classes ?
1 classe à plusieurs utilisateurs ?

Si c'est 1 utilisateur lié à 1 classe, et 1 classe à n utilisateur, il faut changer :
table USERS
user_id
user_nom
...
class_id

table CLASSES
class_id
class_nom
...

Et ça suffit.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Et puisque j'y suis :

http://www.sam-mag.com/P53,53,5,55,,,default.aspx

très bon article qui résume Merise. Bon pense-bête :-)
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009

Tu dois faire des relations ? Je vois pas trop ce que tu veux dire a part peut etre les instructions sql de type INNER JOIN ou OUTER JOIN qui permettent de "lier" differentes tables dans une seule requete.

=> http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap20.htm
Sa peut toujours t'aider...

@+
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
1
Je prend un exemple concret entre ma table utilisateurs et ma table classe je dois établir une relation de un à plusieurs, sous access pas de prob je fais mon organigrame et le tour est joué mais ici je vois pas comment.

Comment peut-on faire pour arriver a ce résultat avec mysql, ou doit-on faire uniquement par requête sql dans le code php. Si c'est dans le code php est ce que quelqu'un aurait un exemple.

En tout cas merci de t'intérreser à mon prob jean84 
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009

Desole mais la je crois que sa depasse mes competences. En plus je ne vois pas trop ce que tu veux dire par relation de 1 ou plusieurs et puis sincerement, moi et access.....

@+
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

table USERS
user_id
user_nom
...

table CLASSES
class_id
class_nom
...

table LNK_USERS_CLASSES
user_id
class_id
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
1
Salut jean84,



Merci quand même c'est sympa de t'être penché sur mon prob.



++
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
1
Salut malalam,

Merci pour ton aide, donc si je comprend bien je dois passer par une table intermédiaire. Je teste ce soir et te dit quoi après.

Bonne soirée.

++
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
1
Merci Malalam ,



Ton aide est précieuse, j'ai test et c'est bon

++
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

bonjour, je me permet de m'incruster dans la conversation pour contribuer un peu et pour demander un peu d'aide:

Dans le cadre d'une relation n-n avec les tables

table USERS
user_id
user_nom
...

table CLASSES
class_id
class_nom
...

table LNK_USERS_CLASSES
user_id
class_id


Si on veut récupérer le user_nom des tout les user liées a la class d'id 1:

SELECT user_nom
FROM (USERS INNER JOIN LNK_USERS_CLASSES ON
USERS.user_id=LNK_USERS_CLASSES.user_id_ID)
WHERE LNK_USERS_CLASSES.class_id=1
ORDER BY user_nom;


Maintenant mon problème: récuperer le user_nom de tout les users qui NE sont PAS
liées à la classe d'id 1.

En esperant que vous avez compris mon message et que vous serez en mesure de m'aider

yohann
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

heu...LNK_USERS_CLASSES.class_id != 1

?
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

Merci pour ta réponse (trop) rapide...

c'est ce à quoi j'ai pensé en premier, Mais un utilisatuer qui n'est lié a aucune classe n'apparaitra pas car il ne sera pas "référencé" dans la table LNK_USER_CLASSES.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ah, fallait l'dire ;-)

LEFT JOIN il me semble...regarde les JOIN, je ne sais jamais lequel va chercher les éléments non présents dans le ON. Mais il y en a un.
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

merci donc j'essaye LEFT JOIN au lieu de INNER JOIN + LNK_USERS_CLASSES.class_id!=1 ce qui donne la requête suivante

SELECT user_nom
FROM (USERS LEFT JOIN LNK_USERS_CLASSES ON
USERS.user_id=LNK_USERS_CLASSES.user_id_ID)
WHERE LNK_USERS_CLASSES.class_id!=1
ORDER BY user_nom;
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Si ta colonne est déclarée NOT NULL, tu devrais faire ça :
SELECT user_nom
FROM USERS LEFT JOIN LNK_USERS_CLASSES ON
USERS.user_id=LNK_USERS_CLASSES.user_id_ID
WHERE LNK_USERS_CLASSES.class_id!=1
OR LNK_USERS_CLASSES.class_id IS NULL
ORDER BY user_nom;
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

ok merci pour le tuyau, j'essaye de suite!
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

On y est presque, merci beaucoup, le probleme se pose maintenant pour le cas d'un utilisateur qui appartient à la classe (et qui pour cette raison ne devrait pas être selectionner) et qui appartient à une autre classe aussi.

En tout cas bien merci
Messages postés
186
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
17 février 2008
1
Salut,

Je suis vos débat entre toi et malalam, qui d' ailleur ta donner des infos intér. Car j'étais confronté plus ou moins au même prob du coup il a fait d'une pierre deux coups. Merci malalam.

Mais yobuntu j'aimerais savoir tu travail sur une application scolaire ? Si oui on peu, peut-être échanger des idées et se refiler des infos des tuyaux l'un l'autre. Si tu es inter contact moi. 

++

Stu76
Messages postés
7
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
2 novembre 2006

en fait le probleme vient de !=1

ce que je voudrait faire c'est plutôt soustraire

SELECT user_nom
FROM USERS LEFT JOIN LNK_USERS_CLASSES ON
USERS.user_id=LNK_USERS_CLASSES.user_id_ID
WHERE LNK_USERS_CLASSES.class_id=1

à

SELECT user_nom
FROM USERS LEFT JOIN LNK_USERS_CLASSES ON
USERS.user_id=LNK_USERS_CLASSES.user_id_ID
WHERE LNK_USERS_CLASSES.class_id!=1
OR LNK_USERS_CLASSES.class_id IS NULL
ORDER BY user_nom;

ceci pour éviter de selectionner un user qui appartient à la fois à la classe 1 et à la classe 2.

J'espère que mon message ne vous embrouille pas trop.

Je crois que je pourrais faire cela par une fonction en php mais cela me prendrai un peu de temps et surtout ralentirai pas mal l'execution.

PS: ou est le bouton éditer?

@stu76, je ne travaille pas sur une application scolaire, mais ça n'empeche pas qu'on se donne des tuyaux...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Tu peux faire des sous requêtes avec ta version de mysql...mssql, c'est quoi d'ailleurs, ton serveur de bdd ?