Aide sur conception requête mysql et affichage php
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:
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:
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:
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:
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
Code:
SELECT * FROM LESSONS
2eme temps : je récupère la liste des membres
Code:
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:
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:
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