Aide pour structurer requette sql

Fermé
zory - Modifié par zory le 8/01/2017 à 17:05
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 8 janv. 2017 à 22:41
Bonjour,

J'ai besoin d'un conseil pour structurer une base de données. et pour écrire du coup la requette associée

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

userid int
membername varchar 50
login varchar 50
pwd varchar 50

chaque utilisateur effectue un des cours de la table "cours"
courid int
nomcours varchar50


pour chaque cours je dois enregistrer un temps de suivis donc la table "duree"

userid int
coursid int
temps int

Pour le moment j'ai deux cours, puisque je ne sais pas faire la requette comme il faut j'ai triché en ajoutant a la table utilisateur deux colone de plus, elle ressemble à ca :
userid int
membername varchar 50
login varchar 50
pwd varchar 50
totaltempscours1 int
totaltempscours2 int

ca me fait une requette assez simple pour obtenir un résultat tel que ceci :
userid, membername, nomcours1, totaltempscours1, nomcours2, totaltempscours2

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.

Pouvez vous m'aider à écrire la requette pour que je puisse récupérer ajouter au bout de ma requette select pour les utilisateur les cours bout a bout tel que ceci
userid, membername, nomcours1, totaltempscours1, nomcours2, totaltempscours2, nomcousX, tempscoursX, ...etc

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

utilisateur
1 toto ***@*** motdepasse
2 titi ***@*** passw1

cours
1 anglais n1
2 anglais n2
3 allemand n1
4 allemand n2

duree
1 1 67
1 1 77
1 1 188
1 2 221
1 2 111


Je bloque depuis plusieurs jours sur ce point. Merci de votre aide précisues.

Zory
A voir également:

4 réponses

yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
8 janv. 2017 à 17:30
bonjour.
Je propose ceci, qui ne fait pas exactement ce que tu demandes:
select utilisateur.userid, membername, nomcours, sum(temps) as totaltempscours
from utilisateur, cours, duree
where duree.userid = utilisateur.userid and cours.coursid = duree.coursid
group by utilisateur.userid, membername, nomcours
order by membername,noncours
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
8 janv. 2017 à 17:38
Bonjour,

Tu ne pourras pas récupérer les données exactement comme tu le souhaites (de façon totalement automatique...)
Par contre... tu peux récupérer les données facilement exploitables en utilisant une requête du genre :
SELECT SUM(D.temps) as TMP
            , C.nomcours
            , U.*    
FROM duree D
LEFT JOIN utilisateur U ON U.userid = D.userid 
LEFT JOIN cours C ON C.courid = D.courid
GROUP BY U.userid,C.courid


Il est assez aisé par la suite de manipuler le résultat de cette requête pour l'afficher sous la forme que tu le souhaites dans ton programme....


NB : Pour faire des tests... réalise les DIRECTEMENT dans ta BDD et non via des lignes de code dans ton programme....
0
Bonjour,

Merci de votre participation messieurs, par contre Jordane, n'est il vraiment pas possible d'ajouter horizontalement dynamiquement les valeurs ? ca me faciliterai extraordinairement les choses ...


Merci de votre aide.
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié par yg_be le 8/01/2017 à 21:30
Les requêtes SQL ne permettent pas d'ajouter horizontalement dynamiquement les valeurs. Cependant, c'est assez simple à faire par programme, et j'imagine que tu vas avoir besoin de l'un ou l'autre programme.
Qu'as-tu autour de ta base de données : un site web, des documents Office, ...?
Que produis-tu : des rapports imprimés, des fichiers, des mail, ...?
0
Je génère des rapports avec du PHP, c'est des statistiques, et j'essaye de rendre mes rapports le plus flexible possible.

je vais essayer de me débrouiller !

Merci de ton aide.
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
8 janv. 2017 à 21:48
En PHP, par exemple, il est assez simple de produire la séquence:
userid, membername, nomcours1, totaltempscours1, nomcours2, totaltempscours2, nomcousX, tempscoursX, ...etc
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié par yg_be le 8/01/2017 à 22:42
Suggestion pour PHP:
1) faire la requête
select userid, membername from utilisateur

2) faire une boucle pour chacun des enregistrements dans la réponse à cette requête
3) pour chacun des userid, faire la requête
select nomcours, sum(temps) as totaltempscours
from cours, duree
where duree.userid = <le userid obtenu dans la requête précédente> and cours.coursid = duree.coursid
group by nomcours
order by noncours

4) afficher les enregistrements obtenu par la seconde requête, tous sur une seule ligne.
0