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

Langage SQL Discussion :

Problèmes pour les requêtes de récupération de données avec jointures


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problèmes pour les requêtes de récupération de données avec jointures
    Bonsoirs cher amis !

    J'ai un petit problème en SQL, j'espère que vous pourrez me filer un petit coup de main.
    Je travaille actuellement sur mon projet qui récupère des donnés sur des films et les stock dans ma base 'cinema' pour ensuite les ré-afficher a de futurs visiteurs. (Site de critiques sur les films, donc il me faut au moins posséder des infos)
    Le problème est que la structure de ma base de données était assez mal conçu,
    Je n'utilisais qu'une seule table, où chaque ligne correspondait a un film, et je pensais mettre des tableaux php (serializés?) dans les champs.
    Par exemple un tableau contenant les acteurs dans le champ 'acteurs'.

    Dorénavant tout a été refait suivant vos précieux conseils,
    J'utilise plusieurs tables pour éviter les duplicata et autres.

    Le problème est que j'ai du mal a récupérer toutes les infos pour un film par exemple, j'obtiens un nombre de résultats impressionnants

    Démonstration:

    SGBD: MySQL v5+ - InnoDB - UTF8

    Structure de la base de données avec données d'exemples:
    http://pastebin.com/BKkhKfW4

    Maintenant j'effectue une requête pour récupérer des données du film portant l'ID 4:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT 
    films.id,
    films.allocine,
    films.titre_vo,
    films.titre_vf,
    films.sortie,
    films.avertissement,
    films.duree,
    films.production,
    films.synopsis,
    acteurs.identite,
    realisateurs.identite,
    genres.genre,
    nationalites.nationalite,
    photos.miniature,
    photos.originale
     
    FROM 
    films
    JOIN _acteurs ON films.id = _acteurs.film
    JOIN acteurs ON _acteurs.acteur = acteurs.id
    JOIN _realisateurs ON films.id = _realisateurs.film
    JOIN realisateurs ON _realisateurs.realisateur = realisateurs.id
    JOIN _genres ON films.id = _genres.film
    JOIN genres ON _genres.genre = genres.id
    JOIN _nationalites ON films.id = _nationalites.film
    JOIN nationalites ON _nationalites.nationalite = nationalites.id
    JOIN _photos ON films.id = _photos.film
    JOIN photos ON _photos.photo = photos.id
     
    WHERE  films.id = 4
    Le serveur me retourne (1 314 total, Traitement en 0.0067 sec.)

    Plus de 1300 lignes sa fait beaucoup à traiter, surtout que je suis obligé de tout mettre dans un tableau PHP et d'eradiquer les doublons pour obtenir ce dont j'ai besoin.

    En rajoutant de la meme manière les films similaires : (11 826 total, Traitement en 0.0529 sec.)
    Ainsi que les tags: (94 608 total, Traitement en 1.1553 sec.)
    Puis les videos: (189 216 total, Traitement en 32.0916 sec.)
    Vous comprenez que cela devient vite ingérable !

    Auriez vous une idée d'amélioration de ma requête de récupération de données? Pensez vous que je dois plutôt effectuer plusieurs requêtes?

    Ps: Il n'y a a pas d'alias pour le moment c'est volontaire, j'effectue d'abord des tests

    merci beaucoup de votre aide !

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par Clooky

    Bonsoirs cher amis !


    J'ai un petit problème en SQL, j'espère que vous pourrez me filer un petit coup de main.
    Vu le contenu de votre message, vous êtes donc Sebi57 (ou son jumeau) qui a écrit le 18 mars dernier :

    Citation Envoyé par Sebi57

    Bonsoirs cher amis !

    J'ai un petit problème en SQL, j'espère que vous pourrez me filer un petit coup de main.

    Après cette première observation :

    Si la table _acteurs comporte N1 lignes pour le film en question, si la table acteurs en comporte N2, etc., le résultat comportera N1 x N2 x ... lignes, donc il n’y a pas lieu de s’étonner.

    En tout état de cause, vous pourriez commencer par injecter une clause DISTINCT pour dédoublonner tout ça. Par ailleurs, au lieu de tout mettre dans un grand sac, mettez les choses dans plusieurs petits sacs, bref, transformez les produits en sommes, de votre requête faites plusieurs requêtes afin de présenter des résultats non redondants et lisibles.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Apparemment, vous n'avez pas tenu compte de certaines remarques de l'autre discussion sur votre modèle de données !

    Citation Envoyé par al1_24
    Il y a donc une relation de 1 à n entre films et affiches, videos ou photos et non n à m comme le montre ton modèle.
    Les tables _affiches, _photos et _videos sont inutiles et leurs informations doivent être rapportées aux tables affiches, photos et videos.
    Je vois dans la requête une table _photos qui, si j'ai bien compris, est une table associative entre les films et les photos et qui suppose donc qu'une photo puisse se rapporter à plusieurs films.

    Je vous renvoie également à mon message qui suggérait une modification de la structure afin déviter la répétition de personnes dans les tables acteurs et réalisateurs.
    D'ailleurs votre structure ne prend en compte que les réalisateurs et les acteurs ; qu'en est-il des scénaristes, dialoguistes, musiciens, directeurs de la photo, producteurs...
    Ma structure permet d'ajouter autant de fonction et autant de types de documents que l'on peut en trouver. Et même des documents non plus sur des films mais sur les personnes, les festivals (j'ai aussi une partie festival dans mon modèle)...

    Enfin, je vous recommande de suivre le bon conseil de fsmrel dans son message juste au-dessus :
    Par ailleurs, au lieu de tout mettre dans un grand sac, mettez les choses dans plusieurs petits sacs, bref, transformez les produits en sommes, de votre requête faites plusieurs requêtes afin de présenter des résultats non redondants et lisibles.
    Il est peu probable que vous afficherez toutes les informations extraites en même temps (le réalisateur + les 35 acteurs + 54 photos + le résumé + les critiques + la bande annonce...).
    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 !

Discussions similaires

  1. Pb transfertdabase pour les requêtes
    Par Elois dans le forum Access
    Réponses: 4
    Dernier message: 24/02/2006, 18h18
  2. [VB.NET]Problème pour les feuilles MDI
    Par Skieur38 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/02/2006, 14h10
  3. Problème pour bâtir requête SQL
    Par Val2005 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/11/2005, 15h49
  4. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 14h48

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