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

Requêtes MySQL Discussion :

INNER JOIN avec integer et varchar


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 7
    Points
    7
    Par défaut INNER JOIN avec integer et varchar
    Bonjour,

    Je débute, merci d'être indulgent.

    Voici ma requète qui fonctionne presque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT acteur.acteur_nom nom, message.*
    FROM wp_plateforme_message message
    INNER JOIN wp_plateforme_acteur acteur
    ON message.id_destinataires = acteur.id
    ORDER BY message.date_crea
    DESC
    Table acteur = id + nom + prénom + etc.
    Table message = id + id_destinataires + contenu + etc.

    acteur.id => integer, c'est l'id de l'acteur
    message.id_destinataires => varchar, une série de nombres séparés par des virgules : 12,44,52, etc.. Ce sont les id des acteurs. C'est peut-être ici que j'ai fait une erreur de conception ?

    Avec ma requête actuelle, nom = nom du premier acteur seulement. Exemple : Machin.
    Comment faire pour que nom = noms de tous les acteurs correspondants et pas seulement le premier ? Exemple : Machin, Truc, Bidule, etc.

    Je viens de m'apercevoir qu'il exsite unsous forum spécialisé pour les requêtes ! Désolé...

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    message.id_destinataires => varchar, une série de nombres séparés par des virgules : 12,44,52, etc.. Ce sont les id des acteurs. C'est peut-être ici que j'ai fait une erreur de conception ?
    Exactement !

    Règle de gestion :
    Un message est envoyé à un à plusieurs acteurs et un acteur peut être destinataire de plusieurs messages.

    MCD :
    message -1,n----envoyer----0,n- acteur

    Tables :
    message (id...)
    acteur (id...)
    message_envoyer_acteur (id_message, id_acteur_destinataire...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci de vous être intéressé à mon cas

    J'ai finalement compris que je ne devais pas enregistrer les id des destinataires sous forme d'une suite de chiffres dans une colonne de la table message.

    Mais je n'ai pas bien compris votre proposition.

    Ou est-ce que j'enregistre les id des destinataires (les acteurs) ?

    Je dois créer une nouvelle table ? Quelle serait sa structure ? Quelle relation aurait-elle avec les 2 autres (message et acteur) ?

    Merci de votre aide.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ou est-ce que j'enregistre les id des destinataires (les acteurs) ?

    Je dois créer une nouvelle table ? Quelle serait sa structure ? Quelle relation aurait-elle avec les 2 autres (message et acteur) ?
    Euh... c'est justement ce que j'ai décrit dans mon précédent message !

    En matière de base de données, la démarche consiste par commencer à définir les règles de gestion des données.
    Dans ton cas, si j'ai bien compris, il s'agit d'un acteur qui envoie un message à un ou plusieurs autres acteurs.
    J'en ai donc déduit la règle de gestion suivante :
    Citation Envoyé par CinéPhil
    Règle de gestion :
    Un message est envoyé à un à plusieurs acteurs et un acteur peut être destinataire de plusieurs messages.
    Comme je l'explique dans mon blog, de cette règle de gestion correctement exprimée, il découle naturellement le morceau de MCD (Modèle Conceptuel de Données, méthode Merise) suivant :
    Citation Envoyé par CinéPhil
    MCD :
    message -1,n----envoyer----0,n- acteur
    Et ce MCD entrainera la création des tables que j'ai décrites :
    Tables :
    message (id...)
    acteur (id...)
    message_envoyer_acteur (id_message, id_acteur_destinataire...)
    Chaque entité-type du MCD (acteur et message) entraîne la création d'une table dans la BDD.
    Et comme on a, dans le MCD, une association de type (1,n - 0,n) on crée aussi, comme je l'explique aussi dans mon blog) une table associative donc la clé primaire est composée des clés étrangères référençant les clés primaires des deux tables entrant en jeu dans l'association du MCD.

    Au final, si l'acteur 1 envoie un message aux acteurs 2 et 3, la table message_envoyer_acteur contiendra les données suivantes :
    id_message, id_acteur_destinataire
    1, 2
    1, 3

    C'est plus clair ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Oui c'est super clair

    Merci pour ton aide, désolé d'avoir insisté mais je débute et je n'avais pas compris MCD

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quand tu auras solutionné ton problème, n'oublie pas le petit clic sur !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bon, j'avance...

    J'ai supprimé la colonne id_destinataires de la table message.
    J'ai créé une table associative qui contient 2 colonnes : id_message et id_acteur_destinataire
    J'ai bien mes 3 tables comme décrites dans votre post.

    Et là je galère vraiment => comment rédiger ma requête pour que je puisse regrouper les destinataires associés à chaque message ?

    J'ai cru trouver la solution ici en adaptant la requête à mes besoins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    CONCAT(b.acteur_nom, " " ,b.acteur_prenom) nom,
    a.*
    FROM wp_plateforme_message_destinataire c
    JOIN wp_plateforme_message a ON a.id = c.id_message
    JOIN wp_plateforme_acteur b ON b.id = c.id_acteur
    WHERE a.message_id_auteur = "'.$_SESSION['id_acteur'].'"
    ORDER BY a.message_date_crea
    DESC
    Mais j'ai le même message répété autant de fois qu'il a de destinataires avec la valeur du destinataire qui change à chaque ligne...
    Message 1 - destinataire 1
    Message 1 - destinataire 2
    Message 1 - destinataire 3
    Message 2 - destinataire 1
    Message 2 - destinataire 2
    etc.

    Je voudrais :
    Message 1 - destinataire 1, destinataire 2, destinataire 3
    Message 2 - destinataire 1, destinataire 2
    etc.

    Je ne sais plus trop comment faire... merci de votre aide.

Discussions similaires

  1. Inner join avec condition
    Par fguigui dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/04/2012, 19h40
  2. Inner Join avec des NULL
    Par BLJ.CHAUVIN dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/07/2011, 11h28
  3. INNER JOIN avec un LIKE
    Par Spiritueux dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/10/2008, 17h14
  4. Réponses: 7
    Dernier message: 13/12/2007, 13h32
  5. INNER JOIN avec des données de sélection
    Par EK1_ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/05/2006, 18h40

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