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 :

Créer une relation entre deux tables


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    formation
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : formation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Créer une relation entre deux tables
    Salut a tous,
    Je viens vers vous car je suis débutant en php et mysql et j'aimerais comprendre comment créer une liaison entre deux table pour qu'un champ ( créer juste pour ca ) prennent la valeur de l'id ( qui est en auto incremente) de ma deuxième table et je n'arrive pas a trouver comment faire

    ( les deux tables sont en innodb mais le champ sur la première table ne reprends pas les valeurs de celui de l'autre table et la je vois pas comment faire ca si l'un de vous avait une idée ou un conseil je suis preneur merci

    j’avais vue ce type de requête là ailleurs, mais ça ne permets pas de lié les deux champ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT proprietaires.ID_proprietaire, jeux_video.ID_proprietaire  FROM proprietaires JOIN jeux_video ON proprietaires.ID_proprietaire = jeux_video.ID_proprietaire
    Voila encore merci a vous

    ps si il faut plus d'info n'hésitez pas à demander

  2. #2
    Membre averti Avatar de Freudd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 164
    Points : 377
    Points
    377
    Par défaut
    Bonjour,

    Pour prendre ton exemple tu as une table propriétaires et une table jeux_video sous MySQL :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    --
    -- Structure de la table `jeux_video`
    --
     
    DROP TABLE IF EXISTS `jeux_video`;
    CREATE TABLE IF NOT EXISTS `jeux_video` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `titre` varchar(255) NOT NULL,
      `date` varchar(255) NOT NULL,
      `id_proprietaire` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fk_proprietaire_jeux_video` (`id_proprietaire`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
     
    --
    -- Déchargement des données de la table `jeux_video`
    --
     
    INSERT INTO `jeux_video` (`id`, `titre`, `date`, `id_proprietaire`) VALUES
    (1, 'Portal', '10/10/2017', 2),
    (2, 'The Binding of Isaac', '28/09/2011', 3);
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `proprietaires`
    --
     
    DROP TABLE IF EXISTS `proprietaires`;
    CREATE TABLE IF NOT EXISTS `proprietaires` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `firstname` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
     
    --
    -- Déchargement des données de la table `proprietaires`
    --
     
    INSERT INTO `proprietaires` (`id`, `name`, `firstname`) VALUES
    (1, 'PETIT', 'Marie'),
    (2, 'DUPOND', 'Pierre'),
    (3, 'MEYER', 'Jean'),
    (4, 'MARTIN', 'Manon');

    Si tu veux savoir quel propriétaire possède un jeu, normalement ta clause de jointure devrait être bonne.
    Après tu ne nous as pas montré ton schéma de base donc c'est un peu dure à deviner.
    Si tu débutes en PHP/MySQL il existe de très bon tutoriels sur le site :


    Bon courage ^^

    PS : Les noms de champs et tables en snack_case c'est très bon, mais évite les majuscules au maximum, genre id_proprietaire plutôt que ID_proprietaire
    Mon projet CMS https://soosyze.com/
    Son repo github https://github.com/soosyze/soosyze

    Open source tools and free yes, but with elegance .

  3. #3
    Candidat au Club
    Homme Profil pro
    formation
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : formation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    alors tout d'abord merci de ta réponse, oui je n'ai pas montré les structure de la table car je voulais pas trop chargé la demande d'une part et surtout je veux essayer de comprendre la logique et pas une requête toute faite d'autre part. C'est pour ca que je donne surtout la base et le but et non la structure exact mais si ça peux vous aider voila, j'ai créer une base

    jeux_video avec un champ id_proprietaire ( parmi les autres qui n'ont que peu d'importance du coup )

    et une base

    proprietaire ( j'ai enlever id_ pour plus de compréhension) avec la cle id_proprietaire qui est la clé primaire en auto incremente ) ( et d'autres champ sans importance pour mon problème)

    et j'aimerais que le champ id de la table jeux reprenne la valeur du champ id dans proprietaire voila car la actuellement tout les champ id-proprietaire de la table jeux sont par defaut et non ceux de l'id de la table proprietaires ( voila j'espère avoir été clair dans mes explications ^^ )

    voila, et encore merci

    ps j’irais voir les tutos c'est toujours bon a prendre

  4. #4
    Candidat au Club
    Homme Profil pro
    formation
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : formation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    personne n'a de conseil ni d'infos pour m'aider ?

  5. #5
    Membre averti Avatar de Freudd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 164
    Points : 377
    Points
    377
    Par défaut
    Désolé, mais je ne comprends pas vraiment ta demandes, je ne vois pas quel(s) conseil(s) je peux te donner.
    Tu veux une explication sur les jointures en SQL ?
    Je vais repartir avec le schéma de base que j'ai fournis au post précédent, mais cette fois-ci en affichant ce que les tables contiennes.
    Ta table proprietaires avec sa clé primaire 'id' :
    id name firstname
    1 'PETIT' 'Marie'
    2 'DUPOND' 'Pierre'
    3 'MEYER' 'Jean'
    4 'MARTIN' 'Manon'

    La table jeux_video avec sa clé primaire 'id' et une clé étrangère `id_proprietaire` (donc une valeur fessant référence à une donnée d'une autre table dans notre exemple)
    id titre date id_proprietaire
    1 'Portal' '10/10/2017' 2
    1 'The Binding of Isaac' '28/09/2011' 3

    Disons que tu souhaites récupérer tous les propriétaires ainsi que ceux possédant des jeux tu fais une jointure GAUCHE :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    jeux_video.id AS jeux_video_id,
    titre,
    proprietaires.id AS proprietaires_id,
    name,
    firstname
    FROM proprietaires 
    LEFT JOIN jeux_video ON jeux_video.id_proprietaire = proprietaires.id;

    jeux_video_id titre proprietaires_id name firstname
    1 'Portal' 2 DUPOND Pierre
    2 'The Binding of Isaac' 3 MEYER Jean
    NULL NULL 1 PETIT Marie
    NULL NULL 2 MARTIN Manon

    Dans ce cas ça calcule l'intersection de la table proprietaire avec les données de la table jeux_video
    avec pour élément commun la clé étrangère 'id_propriétaire' dans la table jeux_video
    Avec des diagrammes de Venn une jointure GAUCHE ça ressemble à ça :

    Nom : sql-left-join-300.png
Affichages : 2998
Taille : 15,9 Ko
    A = table propriétaire
    B = table jeux_video

    Si tu veux récupérer uniquement ce qui possède un jeu et pas les autres il faut faire une jointure DROITE.
    (Dans le tableau d'exemple ci-dessus sa te sortiras que les 2 premières lignes)

    et j'aimerais que le champ id de la table jeux reprenne la valeur du champ id dans proprietaire voila car la actuellement tout les champ id-proprietaire de la table jeux sont par defaut et non ceux de l'id de la table proprietaires ( voila j'espère avoir été clair dans mes explications ^^ )
    Alors, là je comprends vraiment pas, tu peux pas remplacer le champ id de la table jeux_video par celui de l'id de la table proprietaire. Il s'agit de 2 clés uniques représentant leurs données respectives. Au mieux tu peux les masquer.

    Maintenant si tu veux comprendre mathématiquement le concept d'une base de données relationnelles tourne toi vers la théorie des ensembles :
    https://fr.wikipedia.org/wiki/Alg%C3...%27un_ensemble

    Je pense que t'imagine pas à quel point c'est chiant de remplir des tableaux avec l'éditeur de texte donc, cette fois-ci je ne ré-expliquerais pas, il va falloir que tu te documentes

    Bon courage

    PS : une table et un ensemble de données, une base et un ensemble de table, donc on ne dit pas 'base propriétaire' mais une 'table propriétaire' dans ton cas.
    Mon projet CMS https://soosyze.com/
    Son repo github https://github.com/soosyze/soosyze

    Open source tools and free yes, but with elegance .

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu ne peux pas faire ça avec deux tables, ça ne tiens pas la route. Créer une base de données ne s'improvise pas. Avant d'écrire la moindre instruction SQL et de créer des tables, il faut déterminer quelles sont les différentes entités en jeu (propriétaire, jeu video) et leurs relations en se posant des questions du genre:
    • est-ce qu'un propriétaire peut avoir plusieurs jeux vidéos?
    • est-ce que plusieurs propriétaires peuvent avoir le même jeu vidéo?
    Sans ce travail préalable tu ne peux pas concevoir un modèle.

    Sauf contrainte particulière, je répondrai oui aux deux questions, mais avec ton modèle actuel, si on répond oui à la première question, on autorise alors ce genre de chose dans la table propriétaire:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id_pro | nom_pro | prenom_pro | fk_id_jvd
    -------+---------+------------+----------
         1 | Goulard |  Geneviève |         4
    -------+---------+------------+----------
         2 | Goulard |  Geneviève |        18
    -------+---------+------------+----------

    soit un même propriétaire avec deux id_pros différents, or id_pro est censé représenter une personne, pas la relation entre une personne et un jeu vidéo. En plus d'être totalement inexploitable, cela entraîne également une duplication de l'information (le même nom/prénom est présent deux fois dans la table).

    La solution est d'utiliser trois tables au lieu de deux:
    • t_proprietaire: id_pro, nom_pro, prenom_pro
    • t_jeuvideo: id_jvd, nom_jvd
    • t_proprietaire_jeuvideo: fk_id_pro, fk_id_jvd
    .
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Créer une relation entre deux tables en liste de choix via SQL
    Par myrddin99 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/05/2012, 22h44
  2. comment créer une relation entre 2 table?
    Par giguoin dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/04/2010, 14h31
  3. Comment établir une relation entre deux tables
    Par Monta^^ dans le forum Hibernate
    Réponses: 15
    Dernier message: 30/04/2009, 19h54
  4. Comment créer une contrainte entre deux tables ?
    Par Invité dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/04/2009, 16h53
  5. Supprimer et créer une relation entre deux tables
    Par bassiste dans le forum Administration
    Réponses: 1
    Dernier message: 18/07/2008, 20h20

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