Bonjour,

J'ai besoin d'un conseil pour extraire et structurer des données d'une base de données.

Voici mon probleme
J'ai la table "MEMBERS" structurée ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
MEMBERS_ID int AI
MEMBERS_USERNAME varchar 150 
MEMBERS_EMAIL varchar 150 
MEMBERS_PWD varchar 50 
MEMBERS_IDSOCIETE int
chaque membre effectue un des cours enregistrés de la table "LESSONS"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
LESSONS_ID int AI
LESSONS_NOM varchar50

Pour chaque cours je dois enregistrer un temps que le membre a mis pour suivre le cours, donc la table "MEMBERS_ACTIVITY"

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
MEMBERS_ACTIVITY_ID int 
MEMBERS_ACTIVITY_USERID int 
MEMBERS_ACTIVITY_LESSONID int
MEMBERS_ACTIVITY_ID_TOTALTIMEINSEC
Un membre peut suivre plusieurs fois le cours, je dois l'enregistrer X fois.

Pour le moment j'ai 4 cours, puisque je ne sais pas faire autrement j'ai bricolé en ajoutant a la table members 4 colones de plus, elle ressemble à ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
MEMBERS_ID int AI
MEMBERS_USERNAME varchar 150 
MEMBERS_EMAIL varchar 150 
MEMBERS_PWD varchar 50 
MEMBERS_ACTIVITY-L1-TEMPS int 
MEMBERS_ACTIVITY-L2-TEMPS int
MEMBERS_ACTIVITY-L3-TEMPS int
MEMBERS_ACTIVITY-L4-TEMPS int
ca ne me plait pas du tout car si j'ajoute un nouveau cours il faut que j'ajoute une colone dans la base de données.
En attendant la requette est assez simple pour obtenir un résultat en ligne pour l'afficher dans un tableau pour tout mes membres tel que ceci avec un simple select:
MEMBERS_ID, MEMBERS_USERNAME, LESSONS_NOM 1, MEMBERS_ACTIVITY, LESSONS_NOM 2, MEMBERS_ACTIVITY-L2-TEMPS,LESSONS_NOM 3, MEMBERS_ACTIVITY-L3-TEMPS,LESSONS_NOM 4, MEMBERS_ACTIVITY-L4-TEMPS,

Mais je vais pas pouvoir tricher ainsi trop longtemps car quand j'aurai 20 cours ou 100 cours ca va etre compliqué et pas propre.

Du coup puisque je ne sais toujours pas faire la requette en une seule fois je l'ai faite en 3 temps. (Beurk)

1er temps : je récupère le nombre de cours
2eme temps : je récupère la liste des membres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT MEMBERS_ID, MEMBERS_USERNAME FROM MEMBERS
3eme temps : En PHP j'affiche mes résultats de mon 2eme temps et pour chaque ligne j'effetue une requette (imaginer si j'ai 100 000 membres ... c'est pourri en performances)
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
Select Sum(MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_TOTALTIMEINSEC) As TEMPS,
  LESSONS.LESSONS_NOM,
  MEMBERS.MEMBERS_IDSOCIETE,
  MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_USERID,
  MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_LESSONID,
  LESSONS.LESSONS_ID,
  MEMBERS.MEMBERS_ID
From
  MEMBERS_ACTIVITY Inner Join
  LESSONS
    On MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_LESSONID = LESSONS.LESSONS_ID
  Inner Join
  MEMBERS
    On MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_USERID = MEMBERS.MEMBERS_ID
Where
  MEMBERS.MEMBERS_IDSOCIETE = :societeid And
  MEMBERS.MEMBERS_ID = :memberid
Group By
  LESSONS.LESSONS_NOM, MEMBERS.MEMBERS_USERNAME, MEMBERS.MEMBERS_IDSOCIETE,
  MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_USERID,
  MEMBERS_ACTIVITY.MEMBERS_ACTIVITY_LESSONID, LESSONS.LESSONS_ID,
  MEMBERS.MEMBERS_ID
Je suis sur que l'on peut faire quelque chose de bien plus optimisé, et plus automatisé, c'est vraiment pas beau et très très lourd.

Voici un jeu de données. la subtilité est sur la table MEMBERS_ACTIVITY ou il peut y avoir plusieurs enregistrement concernant un membre et la durée. Je dois ressortir le cumul temps.

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
MEMBERS 
1 toto ***@*** motdepasse 3
2 titi ***@*** passw1 3
 
LESSONS
1 anglais n1 
2 anglais n2 
3 allemand n1 
4 allemand n2 
 
MEMBERS_ACTIVITY
1 1 67 
1 1 77 
1 1 188 
1 2 221 
1 2 111
Mon niveau en SQL est trop faible. Malgré la lecture de cours et tutoriel, je n'arrive a rien.

Merci de l'aide que vous pourrez m'apporter.

Zory