Bonjour à tous,
Je souhaite créer une base de données de films un peu kitsh pour un projet de VOD que je dois effectuer lors d'un projet d'école.
J'ai donc 5 bases distinctes :
- serial_films : base de films avec toutes les informations associées (description, acteurs etc.)
- serial_origines : base d'intitulé d'origine des films (américain, français etc.)
- serial_films_l_origines : base qui relie les id des films aux id des origines sachant qu'un film peut avoir plusieurs origines donc plusieurs rows par films
- serial_genres : base d'intitulé des genres de films (action, aventure etc.)
- serial_films_l_genres : base qui relie les id des films aux id des genres sachant qu'un film peut avoir plusieurs genres
Mon but est de créer en une seule requête un tableau de résultat comprenant toutes les informations sur un film dont ses origines et ses genres associés. J'ai donc utilisé un GROUP CONCAT pour mettre en une row et séparés par des virgules les genres associés au film, jusque là tout est OK, voici la requête :
Elle marche parfaitement mais voilà, j'aimerai maintenant pouvoir ajouter à ce tableau de résultat, les origines associées donc si on suit le même schéma, on arrive à cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT A.id, A.titre, A.jaquette, A.description, A.realisateur, A.acteurs, A.duree, A.annee, A.nb_vues, A.date_ajout, GROUP_CONCAT(C.intitule_genre SEPARATOR ', ' ) AS genre FROM serial_films A INNER JOIN serial_films_l_genres B ON A.id = B.id_film INNER JOIN serial_genres C ON B.id_genre = C.id_genre_p GROUP BY A.id
Tout marche nickel, j'ai bien toutes les informations que je veux. Néanmoins, la requête met 14 secondes à charger ce qui est énorme et j'ai un deuxième souci, si jamais il y'a plusieurs genres associés au film alors le champ origine contient plusieurs fois l'information à la suite. (ex : France, France, France...le nombre dépend du nombre de genres).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT A.id, A.titre, A.jaquette, A.description, A.realisateur, A.acteurs, A.duree, A.annee, A.nb_vues, A.date_ajout, GROUP_CONCAT(C.intitule_genre SEPARATOR ', ' ) AS genre, GROUP_CONCAT(E.intitule_origine SEPARATOR ', ' ) AS origine FROM serial_films A INNER JOIN serial_films_l_genres B ON A.id = B.id_film INNER JOIN serial_genres C ON B.id_genre = C.id_genre_p INNER JOIN serial_films_l_origines D ON A.id = D.id_film INNER JOIN serial_origines E ON D.id_origine = E.id_origine_p GROUP BY A.id LIMIT 0 , 30
Pensez-vous qu'il y'a un moyen de l'optimiser ? Si non, pensez-vous qu'il serait plus rentable d'effectuer 2 requêtes à la suite, une pour les genres et une pour les origines ? Sachant que chaque requête séparée prend environ 1 seconde.
Qu'en pensez-vous ?
Partager