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 :

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
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
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
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).

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 ?