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 :
chaque membre effectue un des cours enregistrés de la table "LESSONS"
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2LESSONS_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"
Un membre peut suivre plusieurs fois le cours, je dois l'enregistrer X fois.
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
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 :
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.
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
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 * FROM LESSONS
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 SELECT MEMBERS_ID, MEMBERS_USERNAME FROM MEMBERS
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.
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
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.
Mon niveau en SQL est trop faible. Malgré la lecture de cours et tutoriel, je n'arrive a rien.
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
Merci de l'aide que vous pourrez m'apporter.
Zory
Partager