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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 515
    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 515
    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 325
    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 325
    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 600
    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 600
    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