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. 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.
    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. 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. 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. 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. 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. 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,

                  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. 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. 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. 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. 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)"