IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de donn�es Discussion :

SELECT sur 3 tables et enlever les r�sultats d'un table avec cl� primaire compos�e triple [MySQL]


Sujet :

PHP & Base de donn�es

  1. #1
    Membre habitu�
    Homme Profil pro
    Responsable s�curit�
    Inscrit en
    Mai 2013
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Responsable s�curit�
    Secteur : B�timent

    Informations forums :
    Inscription : Mai 2013
    Messages : 8
    Par d�faut SELECT sur 3 tables et enlever les r�sultats d'un table avec cl� primaire compos�e triple
    Bonjour,
    Je veux cr�er un annuaire d'entreprises ("fournisseurs") �tant intervenues sur nos diff�rents chantiers, avec un syst�me de notation et de commentaire associ�.
    L�utilisateur s�identifie sur le site et lorsqu�il va sur sa page apparait la liste des entreprises qui ont particip� � ses chantiers qu�il lui reste � noter. C�est l� mon probl�me : ne faire apparaitre dans la liste que les entreprises qu�il n�a pas encore not�es.

    Ma base de donn�es a donc une table � fournisseurs �, � chantiers �, � contact � et � note �.
    Un utilisateur peut avoir plusieurs chantiers. Un chantier peut avoir plusieurs fournisseurs. Un fournisseur peut avoir particip� � plusieurs chantiers. Un chantier peut avoir plusieurs charg�s d�affaires (utilisateurs).
    Il y a donc des tables de liaison.
    Chaque table a une clef primaire auto-incr�ment�e, mais la table note a une clef primaire compos�e de 3 colonnes qui correspondent aux clefs primaires des 3 autres tables. Pourquoi ? parce qu�une seule note ne peut �tre attribu�e au triptyque utilisateur/chantier/fournisseur (un utilisateur note un fournisseur d�un chantier).
    Je n�ai trouv� que cette solution pour �tre s�r de n�avoir qu�une seule note mais cela me pose probl�me ! (vous vous en doutez bien)
    Je n�arrive pas � lister les fournisseurs des diff�rents chantiers d�un utilisateur que l�utilisateur n�a pas encore not� (donc qui n'ont pas encore de ligne dans la table "note").

    Une �me charitable ? Une solution ? Merci !

    Ci-dessous l�extrait de ma base et mon script PHP.

    Nom : Capture d��cran 2023-08-04 193720.png
Affichages : 135
Taille : 121,1 Ko

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?php
     
    session_start();
     
    $pdo = pdo_connect_mysql();
     
    // Vérifie si utilisateur connecté, sinon redirige vers page de connexion
    if(!isset($_SESSION['username'])){
    	header("Location: ../login.php");
    }
     
    // liste des chantiers du $_session en tant que chargé d'affaire
    $stm0 = $pdo->prepare('SELECT Chantier_Id, Chantier_Nom, Fourn_Id, Fourn_Nom, Fourn_Ville, Contact_Id FROM fournisseur JOIN chantfourn ON Fourn_Id = Chantfourn_FournId 
    JOIN chantier ON Chantier_Id = Chantfourn_ChantId JOIN chantcontact ON Chantier_Id = Chantcontact_ChantierId 
    JOIN contact ON Chantcontact_ContactId = Contact_Id 
    WHERE Contact_Username = ? ;
    $stm0->execute([$_SESSION['username']]);
    $chantfourncharg = $stm0->fetchALL(PDO::FETCH_ASSOC);
    
    ?>

  2. #2
    Expert confirm� Avatar de Toufik83
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par d�faut
    Bonjour,

    Autrement dit, r�cup�rer les chantiers qui n'ont pas encore �t� not�s, et donc joindre la table note avec LEFT JOIN lorsque la valeur de NOTE_Chantierid n'est pas d�finie ou vaut � NULL.

    Je ne sais pas si c'est seulement une erreur de copier/coller, mais d'apr�s ce que je vois, la requ�te n'est pas Ok (erreur de syntaxe...)

  3. #3
    Expert confirm�
    Avatar de S�b.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par d�faut
    Comme dit Toufik83 il faut utiliser une jointure externe (ou un NOT EXISTS), je propose :

    Code sql : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT ALL Contact_Id, Chantier_Id, Chantier_Nom, Fourn_Id, Fourn_Nom
    FROM contact
    INNER JOIN chantcontact ON Contact_Id = Chantcontact_ContactmerckId
    INNER JOIN chantier ON Chantcontact_ChantierId = Chantier_Id
    INNER JOIN chantfourn ON Chantfourn_ChantId = ChantierId
    INNER JOIN fournisseur ON Chantfourn_FournId = Fourn_Id
    LEFT OUTER JOIN note ON TRUE -- Récupère les notes éventuelles
    	AND Contact_Id = Note_ContactId
    	AND Chantier_Id = Note_ChantierId
    	AND Fourn_Id = Note_FournId
    WHERE TRUE
    	-- Contact/Chantier/Fournisseur sans note
    	AND Note_ContactId IS NULL
    	AND Note_ChantierId IS NULL
    	AND Note_FournId IS NULL
    	-- Pour un utilisateur donné
    	AND Contact_Username = ?

  4. #4
    Membre habitu�
    Homme Profil pro
    Responsable s�curit�
    Inscrit en
    Mai 2013
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Responsable s�curit�
    Secteur : B�timent

    Informations forums :
    Inscription : Mai 2013
    Messages : 8
    Par d�faut
    Tout simplement ! Ca marche nickel ! C'est reparti pour le codage. Merci � vous deux d'avoir pris le temps de me r�pondre.

  5. #5
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activit� : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par d�faut
    Avant de se lancer dans les requ�tes il faut stabiliser le mod�le de donn�es.
    Et pour stabiliser le mod�le de donn�es, il faut compl�ter les r�gles de gestion.

    Je suppose qu'un fournisseur peut fournir plusieurs prestations sur un m�me chantier et qu'on note peut �tre diff�remment les diff�rentes prestations d'un m�me fournisseur ? � pr�ciser.

    Je reprends vos r�gles en leur ajoutant un identifiant comme il se doit et en mettant en exergue les manquants

    R001a : un utilisateur peut avoir plusieurs chantiers
    R001b : un chantier peut avoir ??? utilisateurs

    R002a : un chantier peut avoir plusieurs fournisseurs.
    R002b : un fournisseur peut avoir particip� � plusieurs chantiers.

    R003a : un chantier peut avoir plusieurs charg�s d�affaires (utilisateurs)
    R003b : un utilisateur peut avoir ???? chantier(s)

    R004a : un utilisateur peut noter un ou plusieurs chantier(s) (prestations ?) si et seulement si il est charg� de ce chantier ?
    R004b : un chantier (une prestation ?) peut �tre not� par un ou plusieurs utilisateur(s)

    Selon les r�ponses, le mod�le de donn�es change et par cons�quent la solution SQL aussi

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [MySQL-5.6] Select sur plusieurs tables avec le m�me pr�fixe
    Par Bruno.F dans le forum Requ�tes
    R�ponses: 10
    Dernier message: 27/05/2016, 16h03
  2. R�ponses: 2
    Dernier message: 21/10/2013, 15h50
  3. Select sur 2 tables avec SUM pour une
    Par MarcoMada dans le forum Requ�tes
    R�ponses: 6
    Dernier message: 29/10/2012, 08h29
  4. Select sur 2 tables avec deux colonnes identiques
    Par LsMarx dans le forum Requ�tes
    R�ponses: 4
    Dernier message: 07/08/2012, 16h08
  5. select sur 2 tables avec Like
    Par serna dans le forum D�buter
    R�ponses: 16
    Dernier message: 05/01/2010, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo