PHP/MYSQL

Résolu
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...
Configuration: Windows XP
Internet Explorer 6.0

14 réponses

  1. 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)"
    1. 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;
      1. 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).
        1. 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
          1. 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.
            1. 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)
              ------------------------------------------------------------------------------------------------------------------------------------
              1. 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.
                1. 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.
                  1. 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 .
                    1. 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+.
                      1. 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+.
                        1. 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.