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 :

Jointure "one to many"


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Jointure "one to many"
    Bonjour

    J'ai 3 tables :
    PERSONNE (id, nom, prénom, âge, etc...)
    LIVRE (id, titre, auteur, etc...)
    PERSONNE_LIVRE (idPersonne, idLivre)

    Je souhaite récupérer les infos d'une personne (donc le contenu de la table PERSONNE) + les livres lus par cette personne. Certaines personnes peuvent n'avoir lu aucun livre (pas d'entrée avec leur id dans PERSONNE_LIVRE). Dans ce cas je veux quand même obtenir leurs informations issues de la table PERSONNE.

    Pour le moment j'utilise un LEFT OUTER JOIN de PERSONNE_LIVRE dans mon SELECT sur la table PERSONNE. Cela me donne effecitvement une ligne de résultat pour les personnes n'ayant lu aucun livre, mais pour les personnes en ayant lu plusieurs, j'ai évidemment autant de lignes de résultats que de livres lus, donc redondance des données et lourdeur de la requête.

    Je suis convaincu qu'il existe une meilleure solution, mais je n'arrive pas à mettre la main dessus.

    Merci d'avance

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Ce résultat est logique. Il y a autant de lignes que de livres lus.
    Si une personne lit plusieurs livres, alors il est normal que ses informations apparaissent sur chaque ligne, correspondant à chaque livre lu.
    Une présentation du résultat sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personne 1 | livre 1
               | livre 2
               | livre 3
    ou encore :
    Personne 1 | livre 1 | livre 2 | livre 3...
    n'est pas du ressort du SQL. C'est à l'application qui récupère le résultat de la requête de gérer cette présentation.

    Ca n'alourdit pas les requêtes ni leur traitement. Par contre, c'est vrai que ça alourdit la présentation.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci

    Je pensais que le volume de données contenues dans la réponse faisait augmenter le temps de traitement de la requête.

    Ma méthode est donc viable en terme de performance ?

  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
    Vu qu'on est en MySQL, tu peux regarder du côté de GROUP_CONCAT pour générer un résultat de la forme :
    Personne1 Livre1, Livre2, Livren...
    Personne2 Livre3
    ...
    Par contre, je ne sais pas comment cette fonstion va se comporter avec des personnes n'ayant lu aucun livre.

    Mais j'abonde totalement dans ce qu'a dit ced : ce que tu cherches à faire est de la cosmétique.

    Je pensais que le volume de données contenues dans la réponse faisait augmenter le temps de traitement de la requête.

    Ma méthode est donc viable en terme de performance ?
    C'est même la méthode la plus viable !
    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
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Citation Envoyé par juni_be_good Voir le message
    Ma méthode est donc viable en terme de performance ?
    oui ! si tes tables sont bien indexées bien entendu

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Mais j'abonde totalement dans ce qu'a dit ced : ce que tu cherches à faire est de la cosmétique
    L'exemple est on ne peut plus clair.

    C'est assez curieux que j'en sois venu à me poser ces questions non pas pour améliorer le format de sortie de mes données (j'effectue déjà les traitements cosmétiques en aval) mais précisément pour améliorer ce que je pensais être une horreur en terme d'optimisation.

    Merci pour les réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de jointure dans une relation many to one
    Par info_plus dans le forum JPA
    Réponses: 1
    Dernier message: 25/12/2008, 12h29
  2. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 14h47
  3. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26

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