Bonjour,

Je souhaite actuellement réaliser une base de donnée pour la mise en place d'une application de gestion de parc informatique :
Le problème que je rencontre, c'est que je n'arrive pas à faire les jointures de mes différentes tables :

Voici la conception actuelle de ma base :

Bureau

  • id_Bureau
  • libelle

Propriétaire

  • id_proprio
  • Nom
  • Tel

Poste

  • id_poste
  • num_serie
  • marque
  • date_achat
  • date_fingarantie

Ecran

  • id_ecran
  • num_serie
  • marque
  • date_achat
  • date_fingarantie

Avoir

  • id_Bureau #
  • id_proprio #
  • id_poste #
  • id_ecran #

J'ai fait 4 jointures sur la table avoir, par exemple le champs avoir.id_bureau pointe sur bureau.id_bureau.

Mais quand je fait ce genre de requette, la base me renvoi une valeur vide :

SELECT *
FROM bureau, poste, ecran, proprio, avoir
WHERE bureau.id_bureau = avoir.id_bureau
AND poste.id_poste= avoir.id_poste
AND ecran.id_ecran= avoir.id_ecran
AND proprio.id_proprio= avoir.id_proprio

Merci de votre aide.

5 réponses


dadouduck
Réponse acceptée

Il y a effectivement ambiguïté sur les dans num_serie, marque, date_achat et date_fingarantie, pour éviter cela, en général, je préfixe les champs de mes tables par 4 lettres (sauf les id), ça donnerait cela :

bureau

  • id_bureau
  • bure_libelle

proprietaire

  • id_proprio
  • prop_Nom
  • prop_Tel

poste

  • id_poste
  • post_num_serie
  • post_marque
  • post_date_achat
  • post_date_fingarantie

ecran

  • id_ecran
  • ecra_num_serie
  • ecra_marque
  • ecra_date_achat
  • ecra_date_fingarantie

avoir

  • id_bureau #
  • id_proprio #
  • id_poste #
  • id_ecran #

Et je ferais la requête suivante :
SELECT * FROM bureau NATURAL JOIN proprietaire NATURAL JOIN poste NATURAL JOIN ecran

Je pense qu'il va y avoir des ambiguïtés sur certains champs de même nom qui sont présents dans différentes tables si tu mets SELECT *

SELECT *
FROM bureau INNER JOIN avoir USING (id_bureau)
            INNER JOIN poste USING (id_poste)
            INNER JOIN ecran USING (id_ecran)
            INNER JOIN proprio USING (id_proprio);

Un INNER JOIN serait plus approprié ici. Question bête, tes tables sont-elles remplies ?

Une ambiguité pourrait être si signalé si il était par exemple question d'une requête suivante :

SELECT date_achat FROM poste INNER JOIN ecran

Deux noms de champs identiques issus de deux tables différentes ne provoquera pas une ambiguïté comme on l'entend sous mysql lors d'une sélection de l'intégralité des champs (*).

En revanche, je rejoins tout à fait dadouduck sur le fait de respecter une certaine convention dans le nommage de tes noms de champs. Cela te permettra une lecture plus rapide de ta bdd.

Bonjour,
Merci pour vos réponses.
Alors j'ai modifié le nom de toutes mes tables pour éviter les ambiguïtés, et j'ai entrer cette requête, mais elle me renvoi un résultat vide :

SELECT *
FROM bureau INNER JOIN avoir USING (id_bureau)
            INNER JOIN poste USING (id_poste)
            INNER JOIN ecran USING (id_ecran)
            INNER JOIN proprio USING (id_proprio);

Pourtant j'ai bien des données dans mes tables. Je n'arrive pas à comprendre pourquoi.

EDIT
En tapant cette requête ça marche :

SELECT * FROM bureau NATURAL JOIN proprietaire NATURAL JOIN poste NATURAL JOIN ecran

Merci beaucoup pour votre aide.