PHP/MYSQL

Résolu/Fermé
chahrazadmimo - 1 oct. 2008 à 13:40
 Rollin'babe !! - 3 oct. 2008 à 18:44
Bonjour,
J'etais volantaire pour faire une petite app Web php/mysql pour mon ecole mais je ne savais que j'allait caler aussi vite...
Il s'agit de creer des partenariats entre les etudiants pour des partages de fichiers ou messagerie...
Chaque etudiant peut choisir un ou plusieurs etudiants dans l'ecole.
Pour cela j'ai crée une table "ETUDIANTS" contenant l'identifiant de chaque etudiant IDetudiant et son login($_SESSION).
Pour le partage j'ai crée une table "PARTENAIRES" contenant
IDpartenaires,
IDetudiant,
IDdupartenaire,
Le nombre de ligne dans la table par exemple pour 100 etudiants sera 99 lignes donc on ne doit pas trouver (EtudiantA,EtudiantB) et (EtudiantB,EtudiantA) sinon cela donnera des milliers de cas!
Je vais afficher pour chaque etudiant qui se connecte dans une liste tous ses partenaires et dans une autre liste tous les autres pour qu'il puisse demander leur partenariat.J ai voulu faire cela sans boucle ^juste avec une requete SQL.
Voici ma requete pour afficher les partenaires d'un etudiant:

"SELECT * FROM PARTENAIRES,ETUDIANTS WHERE ETUDIANTS.IDetudiant<>'Login' AND (IDetudiant='login' OR IDdupartenaire='login') AND (ETUDIANTS.IDetudiant=pa OR ETUDIANTS.IDetudiant=pb)"

La requete affiche correctement le resultat le probleme c'est pour afficher l'inverse c-a-d les autres qui ne sont pas partenaires.(J ai fais presque toutes les combinaisons mais ça donne des resultat bizare)
Bon voila j'espere que c est un peu clair si qlq pourrait me donner une issue...
A voir également:

14 réponses

dindoun Messages postés 1028 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 17 février 2017 135
1 oct. 2008 à 14:01
donne ta table en clair
1
chahrazadmimo
1 oct. 2008 à 13:48
Désolé voici la requete SQL pour afficher les partenaires:

"SELECT * FROM PARTENAIRES,ETUDIANTS WHERE ETUDIANTS.IDetudiant<>'Login' AND (PARTENAIRES.IDetudiant='login' OR PARTENAIRES.IDdupartenaire='login') AND (ETUDIANTS.IDetudiant=PARTENAIRES.IDetudiant OR ETUDIANTS.IDetudiant=PARTENAIRES.IDdupartenaire)"
0
chahrazadmimo
1 oct. 2008 à 14:14
Voici mes tables
CREATE TABLE `PARTENAIRES` (
`IDpartenaires` int(11) NOT NULL auto_increment,
`IDetudiant` varchar(100) NOT NULL default '',
`iddupartenaire` varchar(100) NOT NULL default '',
PRIMARY KEY (`idpartenariat`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



CREATE TABLE `ETUDIANTS` (
`IDetudiant` int(11) NOT NULL auto_increment,
`login` varchar(150) NOT NULL default '',
PRIMARY KEY (`IDetudiant`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
0
Rollin'babe !!
1 oct. 2008 à 14:25
Bonjour,

J'ai quelques question par rapport à vos 2 tables :

CREATE TABLE `PARTENAIRES` (
`IDpartenaires` int(11) NOT NULL auto_increment,
`IDetudiant` varchar(100) NOT NULL default '',
`iddupartenaire` varchar(100) NOT NULL default '',
PRIMARY KEY (`idpartenariat`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



CREATE TABLE `ETUDIANTS` (
`IDetudiant` int(11) NOT NULL auto_increment,
`login` varchar(150) NOT NULL default '',
PRIMARY KEY (`IDetudiant`)

1- Pour quoi IDetudiant de 'PARTENAIRES' (varchar(100)) n'a pas la même dimension
du IDetudiant de ETUDIANTS (int(11)) ?.
2- Pourquoi iddupartenaire de 'PARTENAIRES' de type (varchar(100)) et pas int(11)
comme on pourrait s'attendre par analogie avec IDetudiant de ETUDIANTS ?.
3- Pouvez vous définir plus explicitement la pseudo PK `idpartenariat` : de quoi est elle constituée comme PK ?.

Thank's.
___________________________________________________________________________________________
Ouais mec - après ma mort avant de r'joindre l'Ancien chuis allé faire un chtit tour à la "foire du slip"
... une vraie bande de mariolles dis donc - ca fait pitié - chuis r'monté vite fait ben fait :> (Jésus Christ).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chahrazadmimo
1 oct. 2008 à 14:34
merci
Oui j ai vu le probleme des dimensions parceque je les refait à la hate j ai fait juste un morceau la ou il ya le probleme...


idpartenaire au lieu idpartenariat
0
Rollin'babe !!
1 oct. 2008 à 15:44
Re,

Je crois que vous vous cassez la tête pour rien avec 2 tables :

Une seule suffit - soit cette table ETUDIANT-PARTENAIRES :

CREATE TABLE `ETUDIANTS-PARTENAIRES` (
`IDetudiant` int(11) NOT NULL auto_increment,
`login` varchar(150) NOT NULL default '',
'IDpartenaire' int(11) NOT NULL default 0
PRIMARY KEY (`IDetudiant', 'IDpartenaire`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

C'est une "self-referencing" table car IDpartenaire (PK2) devra être référencée dans la table même sur IDetudiant (PK1).
En mettant la PK sur le couple (IDetudiant, IDpartenaire) - ca permettra à votre table d'évoluer sans problèmes si un jour vous envisagez des partenariats à plus de 2 personnes - non ?.

Vous voyez.
Salut.
0
Rollin'babe !!
1 oct. 2008 à 16:19
Ma solution est valable avec une table de référence ETUDIANT bien sur :

CREATE TABLE `ETUDIANTS` (
`IDetudiant` int(11) NOT NULL auto_increment,
`login` varchar(150) NOT NULL default '',
PRIMARY KEY (`IDetudiant')
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ET en modifiant ainsi celle du POST précédent :

CREATE TABLE `ETUDIANTS-PARTENAIRES` (
`IDetudiant` int(11) NOT NULL 0,
'IDpartenaire' int(11) NOT NULL default 0
PRIMARY KEY (`IDetudiant', 'IDpartenaire`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Exemple : partenaires des étudiants 1 et 2 :

SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND (A.IDetudiant = 1 or A.IDetudiant = 2)

Exemple : étudiants non partenaires avec les étudiants 1 et 2 :

SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire <> C.IDetudiant
AND (A.IDetudiant = 1 or A.IDetudiant = 2)
------------------------------------------------------------------------------------------------------------------------------------
0
Rollin'babe !!
1 oct. 2008 à 16:29
Re,

J'ai involontairement mis ce POST sur "résolu" alors que je n'en avais pas la responsabilité nromalement.
C'est une erreur de manip. (:<) !!.

Sorry.
0
Rollin'babe !!
1 oct. 2008 à 17:48
Oupss,

Voici les corrections pour la 2éme requête :

Exemple : tous les étudiants non partenaires avec les étudiants 1 et 2 :

SELECT IDetudiant, login
FROM ETUDIANTS
WHERE (IDetudiant <> 1 AND IDetudiant <> 2)
AND
IDetudiant NOT IN
(
SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND (A.IDetudiant = 1 OR A.IDetudiant = 2)
)

Ce sera tout - merci pour vos remarques.
0
chahrazadmimo
2 oct. 2008 à 00:46
desolé du retard je viens juste de rentrer...
Le probleme ce n est pas de comparer etudiant 1 et etudiant 2 avec les autres mais de comparer etudiant 1 seul avec les autres .
0
Rollin'babe !!
2 oct. 2008 à 07:44
Re,

Peux tu mettre à statut non résolu stp ??...
Merci !!.

"Le probleme ce n est pas de comparer etudiant 1 et etudiant 2 avec les autres mais de comparer etudiant 1 seul avec les autres ."

J'te prends au mot :

==>

Exemple : partenaires de l'étudiant 1 :

SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND A.IDetudiant = 1

Tous les étudiants non partenaires avec l'étudiant 1 :

SELECT IDetudiant, login
FROM ETUDIANTS
WHERE IDetudiant <> 1
AND
IDetudiant NOT IN
(
SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND (A.IDetudiant = 1)
)
_________________________________________________________________________________
Dans tous les cas - j'espère que mes tables te conviennent- peu pas faire mieux pour éviter une "usine à gaz".
Avec ces tables - tu peut faire n'importe quelle requête - le structure est souple et simple.

Ça te convient ou pas ?.

A+.
0
Rollin'babe !!
2 oct. 2008 à 08:29
Re !!,

Reprenons tes besoins :

"Je vais afficher pour chaque etudiant qui se connecte dans une liste tous ses partenaires et dans une autre liste tous les autres pour qu'il puisse demander leur partenariat."

Donc :

"Je vais afficher pour chaque etudiant qui se connecte dans une liste tous ses partenaires"

SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND A.login = "toto" --> c'est le login de l'étudiant

".... et dans une autre liste tous les autres pour qu'il puisse demander leur partenariat."

SELECT IDetudiant, login
FROM ETUDIANTS
WHERE login <> "toto"
AND
IDetudiant NOT IN
(
SELECT C.IDetudiant, C.login
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND (A.login = "toto")
)

Avec :

CREATE TABLE `ETUDIANTS` (
`IDetudiant` int(11) NOT NULL auto_increment,
`login` varchar(150) NOT NULL default '',
PRIMARY KEY (`IDetudiant')
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `ETUDIANTS-PARTENAIRES` (
`IDetudiant` int(11) NOT NULL default 0,
'IDpartenaire' int(11) NOT NULL default 0
PRIMARY KEY (`IDetudiant', 'IDpartenaire`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--> pour cette dernière table, mettre les clauses FOREIGN KEY ... REFERENCES blabla
pointant sur la table ETUDIANTS mais je connais pas bien MySql.

Et pis c'est tout je crois.

J'attends tes critiques.
A+.
0
Rollin'babe !!
2 oct. 2008 à 11:22
Oupss,

".... et dans une autre liste tous les autres pour qu'il puisse demander leur partenariat."

SELECT IDetudiant, login
FROM ETUDIANTS
WHERE login <> "toto"
AND
IDetudiant NOT IN
(
SELECT C.IDetudiant
FROM ETUDIANTS AS A, ETUDIANTS-PARTENAIRES AS B, ETUDIANTS AS C
WHERE B.IDetudiant = A.IDetudiant
AND B.IDpartenaire = C.IDetudiant
AND (A.login = "toto")
)

Avec :

CREATE TABLE `ETUDIANTS-PARTENAIRES` (
`IDetudiant` int(11) NOT NULL
PRIMARY KEY
REFERENCES ETUDIANTS (IDetudiant)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
'IDpartenaire' int(11) NOT NULL
PRIMARY KEY
REFERENCES ETUDIANTS (IDetudiant)
ON DELETE RESTRICT
ON UPDATE RESTRICT
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Le reste est OK.

ouf.
0
Rollin'babe !!
3 oct. 2008 à 18:44
SEVEN UP !!.
WHAT'S NEW ?.
0