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

 MySQL Discussion :

Select multi tables


Sujet :

MySQL

  1. #1
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut Select multi tables
    Bonjour,

    Je suis en train d'apprendre à faire des select multiples en suivant divers tuto sur le net. Faire un select utilisant 2 tables, pas de problèmes. Mais là je bloque sur un select utilisant 3 tables. Ci-joint le schéma de la base.

    zonesType contient:
    1 - Salon
    2 - Cuisine

    hard contient:
    1 - matos1 - 123456 - 1
    2 - matos2 - 1234567 - 2

    zones contient:
    1 - zones1
    2 - zones2

    zonesHard contient:
    1 - 1 - 1
    2 - 2 - 2

    Comment faire ma requête pour qu'elle me renvoi la liste des "zones" avec la liste des "hard" qui lui sont associées avec en prime le nom "zonesType" associé à chaque matériel ? Là je travaille sur 4 tables, et je suis pommé sur les tutos qui expliquent les jointures.

    Pouvez-vous m'aider ?
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu pourrais donner des explications sur ton schéma ?
    Pourquoi zonesTypes est-elle indépendante de zones ?

    Au passage, tu devrais nommer tes tables au singulier car elles sont issues d'entités types du modèle conceptuel de données, elles mêmes issues de règles de gestion qui expriment les associations pour une entité.

    Par exemple, si je lis ton schéma...

    Règle de gestion :
    Un hard est associé à une zone type et une zone type est associée à un à plusieurs hard.

    Cette règle de gestion donne le MCD suivant :
    zoneType -1,n----associer----1,1- hard

    De plus, dans ton association, tu as choisi l'identification relative qui entraîne la participation de la clé étrangère zonesTypes_idZone à la clé primaire de la table hard.
    Ça peut être une bonne chose dans certains cas mais pas sûr que ce soit pertinent ici.

    Le meilleur cours sur les jointures est celui de SQLPro.

    Montre nous la requête que tu as essayée et nous t'aiderons à la corriger.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Alors voilà:

    - Une zoneType peut faire partie de plusieurs hard
    - Un hard peut appartenir à plusieurs zones

    Je vais tout passer au singulier pour clarifier les choses.
    L'application que je développe est la suivante:

    C'est une application domotique "home made". j'ai plusieurs modules que j'ai fait moi même dispersés dans la maison que je veux pouvoir ajouter à l'application. chaque module (hard) est dans un type de zone (zoneType - exemple: cuisine, sdb, salon, etc.). une fois le matériel déclaré dans l'application, un formulaire permet de créer une "zone" contenant plusieurs modules (hard).

    Peut-être que j'ai mal conceptualisé ma base ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par zerros Voir le message
    Alors voilà:

    - Une zoneType peut faire partie de plusieurs hard
    - Un hard peut appartenir à plusieurs zones
    Tes règles de gestion sont incomplètes. relis mon billet dont j'ai donné le lien dans ma première réponse.

    Il n'y a aucune similitude sémantique entre la zone et la zone type ? Ces appellations prêtent à confusion.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Ok, je vois, je vais déjà revoir mes appellations de tables pour clarifier tout ça,et je reviens poster pour le select.

  6. #6
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Et me revoilà. J'ai revu l'architecture des quelques tables. Je joins le nouveau schéma.

    j'ai simplifié en supprimant une des tables car je me suis rendu compte qu'elle ne servait à rien. Voici donc l'explication:

    - Table type qui contiendra les différents types de pièces d'une maison (cuisine, chambre, salon, db ...)
    - Tale hard qui contiendra le nom du module, sa clé de cryptage et le type de pièce dans laquelle il est situé.
    - Table zone qui contiendra le nom d'un zone, l'id des modules de cette zone.

    Maintenant la question de logique:
    - Un "type" peut être affecté à un ou plusieurs module "hard" (relation 1:n)
    - Un module "hard" peut être affecté à une ou plusieurs "zone" (relation 1:n)

    Ca vous parait mieux que tout à l'heure ? Du coup, je n'aurai certainement pas trop de mal à faire ma requête ...
    Images attachées Images attachées  

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    - Table type qui contiendra les différents types de pièces d'une maison (cuisine, chambre, salon, db ...)
    Puisqu'il s'agit de types de pièces, j'appellerais la table type_piece. Où, puisque tu sembles vouloir utiliser l'anglais, "room_type".
    Et du coup, plutôt que zoneName qui n'a plus aucun rapport avec le nom de la table, appelle cette colonne "roomTypeLabel" ou "roomTypeName".

    À quoi sert le timestamp dans toutes les tables ?
    En plus, comme timestamp est un mot réservé du langage SQL, il ne faut appeler une colonne ou une table ainsi.

    - Table hard qui contiendra le nom du module, sa clé de cryptage et le type de pièce dans laquelle il est situé.
    Pourquoi "hard" et pas "module" ?
    Comme j'ai dit précédemment, il ne me semble pas indispensable que la clé étrangère référençant le type de pièce participe à la clé primaire de cette table.

    Dans MySQL Workbench, utilise plutôt la "non-identifying relationship".

    - Table zone qui contiendra le nom d'un zone, l'id des modules de cette zone.
    Une zone est une zone mais comme il peut y avoir plusieurs dans cette zone, si tu considères qu'un module n'est que dans une seule zone, il faut mettre la clé étrangère référençant la zone dans la table hard.
    Si par contre un module peut faire partie de plusieurs zones, alors il faut rétablir la table associative.

    Maintenant la question de logique:
    - Un "type" peut être affecté à un ou plusieurs module "hard" (relation 1:n)
    - Un module "hard" peut être affecté à une ou plusieurs "zone" (relation 1:n)
    Comme dit dans mon précédent message, tes règles de gestion sont incomplètes. Il y manque à chaque fois la contraposée :

    - Un "type" peut être affecté à un ou plusieurs module "hard" et un module n'est affecté que d'un seul type.

    - Un module "hard" peut être affecté à une ou plusieurs "zone" et une zone peut être couverte par plusieurs modules.

    En vertu de cette dernière règle de gestion, tu dois rétablir la table associative.

    Le MCD qui correspond à ces règles de gestion :
    roomType -0,n----affecter----1,1- module -0,n----couvrir----0,n- zone
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  8. #8
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Okkk. je comprends mieux. j'ai renomer la table type en roomType, et la zoneName en roomName (bonne idée).

    Effectivement un module pour faire partie de plusieurs zones. Donc j'ai rétabli la table intermédiaire. Les cardinalités sont enfin bons je pense. j'ai mis la colonne tstamp pour avoir la date d'insertion des enregistrements. Je ne sais pas encore si je vais les utiliser, mais je préfère le prévoir de suite.

    Du coup, je me retrouve dans la même situation qu’auparavant pour ma requête sql. Je vais refaire quelques insertions et refaire un requête que je viendrai poster si je n'y arrive pas.
    Images attachées Images attachées  

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Au niveau du schéma, c'est beaucoup mieux.

    On attend la suite.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  10. #10
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Bon, je n'ai pas eu beaucoup de temps pour tester ma requête. Le boulou avant mes trucs perso

    Je devrai être plus cool cette semaine, et en plus en vacances dès jeudi soir ouuufff Je reviens poster très vite

  11. #11
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Bon me voilà plus vite que prévu.

    J'ai fait mes inserts.
    --> Table roomType
    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
    +--------+---------------+---------------------+
    | idRoom | roomName      | tstamp              |
    +--------+---------------+---------------------+
    |      1 | Chambre       | 2012-12-17 16:32:59 |
    |      2 | Salle de bain | 2012-12-17 16:33:00 |
    |      3 | Cuisine       | 2012-12-17 16:33:00 |
    |      4 | Salon         | 2012-12-17 16:33:00 |
    |      5 | Couloir       | 2012-12-17 16:33:00 |
    |      6 | Cellier       | 2012-12-17 16:33:00 |
    |      7 | Toilettes     | 2012-12-17 16:33:00 |
    |      8 | Garage        | 2012-12-17 16:33:00 |
    |      9 | Terrasse      | 2012-12-17 16:33:00 |
    |     10 | Jardin        | 2012-12-17 16:33:00 |
    |     11 | Portail       | 2012-12-17 16:33:00 |
    |     12 | Autre         | 2012-12-17 16:33:00 |
    +--------+---------------+---------------------+
    --> table hard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +--------+------------+-----------+---------------------+-----------------+
    | idHard | hardName   | hardKey   | tstamp              | roomType_idRoom |
    +--------+------------+-----------+---------------------+-----------------+
    |      1 | Sapin      | 123456789 | 2012-12-18 21:59:39 |               4 |
    |      2 | Guirlandes | 987654321 | 2012-12-18 21:59:39 |               4 |
    |      3 | Cuisine    | 159753    | 2012-12-18 22:00:02 |               3 |
    +--------+------------+-----------+---------------------+-----------------+
    --> table zone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +--------+----------------------+---------------------+
    | idZone | zoneName             | tstamp              |
    +--------+----------------------+---------------------+
    |      1 | Lumières Sapin       | 2012-12-18 21:56:18 |
    |      2 | Lumières cuisine     | 2012-12-18 21:56:18 |
    |      3 | Lumières guirlandes  | 2012-12-18 21:56:55 |
    +--------+----------------------+---------------------+
    Et ma table intermédiaire harZone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +-------------+-------------+
    | hard_idHard | zone_idZone |
    +-------------+-------------+
    |           1 |           1 |
    |           2 |           1 |
    |           2 |           3 |
    |           3 |           2 |
    +-------------+-------------+
    J'ai donc dans ma zone "Lumières Sapin" les matériels "Sapin" et "Guirlandes".
    Dans ma zone "Lumières cuisine" le matériel "Cuisine"
    Dans ma zone "Lumières Guirlandes" le matériel "Guirlandes"

    Je voudrai arriver à sortir en une requête l'ensemble des matériels pour chaque zone. Ce serait peut-être plus simple de faire un premier select dans la table zone et ensuite de refaire un select par rapport à chaque idZone dans la boucle pour récupérer les matériels (php). Mais ça ne m'apprendrai rien

    J'ai donc réussi à faire cette requête en furetant sur le net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select idHard,hardName,hardkey from hardZone hz,hard h where hz.zone_idZone IN (SELECT idZone FROM zone) AND hz.hard_idHard=h.idHard;
    Ce qui me renvoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +--------+------------+-----------+
    | idHard | hardName   | hardkey   |
    +--------+------------+-----------+
    |      1 | Sapin      | 123456789 |
    |      2 | Guirlandes | 987654321 |
    |      2 | Guirlandes | 987654321 |
    |      3 | Cuisine    | 159753    |
    +--------+------------+-----------+
    Mais le problème, c'est que je n'ai pas le nom de la zone (zoneName) ni son id (idZone). Normal quoi, puisque nulle part je lui dit de récupérer ces infos. Mais je ne sais pas comment rentrer la condition dans ma requête pour en plus avoir le nom de la zone et son id dans 2 colonnes supplémentaires.

    Pouvez-vous me mettre sur la voie ?

Discussions similaires

  1. [MySQL] Requete SELECT multi-tables avec un ORDER BY
    Par Twenty4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/12/2010, 02h36
  2. Selection multi table avec filtre
    Par curumo dans le forum Requêtes
    Réponses: 6
    Dernier message: 20/11/2009, 23h16
  3. update d'un champ avec select multi-table
    Par maxvador dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/09/2009, 11h54
  4. SELECT multi tables
    Par Rocou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2007, 09h53
  5. Modification de champs issus d'un select multi table
    Par plancade dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/06/2007, 16h25

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