8771 sujets

Développement web côté serveur, CMS

Bonjour à tous

Je voudrais votre avis sur la façon de traiter le problème suivant :
J'ai une table Works qui contient la descriptions d'oeuvres musicales.
Une œuvre musicale contient (ou non) des mouvements, par exemple une œuvre de Maurice Ravel s'appelle "3 chansons" et comporte bien entendu 3 œuvres distinctes qui forment un tout mais qui peuvent être jouées séparément. Un "mouvement" est donc décrit dans cette table au même titre que l’œuvre principale
La table contient donc
- un champ workKey qui est l'identifieur unique d'une œuvre
- un champ mainWorkKey qui est NULL si l’œuvre n'est pas un mouvement ou qui contient l'identifieur de l’œuvre principale si l’œuvre est un mouvement.
Ce mécanisme permet facilement de définir le programme d'un concert, sous la forme d'une suite d’œuvres.

Parmi les champs qui définissent une œuvre dans la table, on a entre autres
- le "casting" qui permet de savoir par exemple si une œuvre est destinée à être jouée par un piano seul, ou soprano + piano, chœur + piano, soprano + chœur + piano, chœur seul, etc.
- l'adresse du fichier PDF contenant la partition de l’œuvre.

L'objectif de mon programme est de faire la liste des œuvres ayant une partition et dont au moins un des mouvements contient un chœur dans le casting

Pour l'instant je fais :
- une première requête qui me donne la liste des workKey des œuvres ayant une partition et un chœur dans le casting
- une deuxième requête qui me donne la liste des mainWorkKey de ces œuvres
- une troisième requête qui me donne la liste des workKey des mouvements de ces œuvres
Je fais un array_merge des trois listes et un array_unique sur le résultat, puis une quatrième requête pour obtenir la liste des informations qui m'intéressent, ce qui donne par exemple

upload/1669285982-48769-scorelist2.png

Il s'agit d'une œuvre qui contient 12 mouvements, 11 pour chœur et harpe et un "Interlude" pour harpe solo.
Les boutons en forme de clef de sol permettent d'afficher la partition, les boutons bicolores affichent le texte original en vieil anglais et sa traduction en français. On voit que le mouvement "Spring Carol" possède deux partitions.

Je trouve ce processus particulièrement lourd, mais je n'ai pas trouvé plus simple.

Une idée pour faire cela plus simplement ?
Modifié par PapyJP (24 Nov 2022 - 11:54)
Expliquer le problème m'a aidé à le comprendre et à trouver une solution avec une seule requête qui n'a qu'une seule sous-requête.