[Complément] Statistiques saison de hockey

Statistiques saison de hockey [Complément] - SQL/NoSQL - Programmation

Marsh Posté le 30-03-2005 à 11:26:39    

Bonjour et tout d'abord merci à tout ceux qui auraient décidés de m'aider :hello:
 
Je suis entrain de créer quelques pages en PHP et quelques requêtes pour aider un ami et j'avoue que mes connaissances en SQL sont plutôt limitées.
 
Voilà le schéma de la base :
 
http://chli.zapto.org/public/db.png
 
et voilà à quoi j'aimerais arriver en une seule requête :
 
http://www.bruleglace.com/stats/index.php3
 
(Pour chaque joueur, le nombre de matchs auquel il a participé, le nombre de buts qu'il a marqué, le nombre d'assists qu'il a fait et le nombre de minutes de pénalités qu'il a eu tout ça en une saison)
 
 
J'ai fait un LEFT OUTER JOIN pour avoir au moins une fois chaque joueur, j'arrive à avoir le nombre de match auquel à participé un joueur, mais après ça coince. Voilà ma requête (incorrect) :
 
SELECT J.Jou_Nom, J.Jou_Prenom, J.Jou_Numero, COUNT(NM.Jou_IDE) as NB_Matchs, COUNT(B.Jou_IDE) as NB_Buts, SUM(P.Pen_Duree) as NBPenalites FROM (((joueurs as J LEFT OUTER JOIN nm_matchsjoueurs as NM ON J.Jou_ID = NM.Jou_IDE) LEFT OUTER JOIN buts as B ON J.Jou_ID = B.Jou_IDE) LEFT OUTER JOIN penalites as P ON J.Jou_ID = P.Jou_IDE) GROUP BY J.Jou_ID ORDER BY J.Jou_Nom.
 
Ce qui me retourne :
 
http://chli.zapto.org/public/result.png
 
Hors il n'y a qu'une seule pénalité de 15 minutes et non pas 2 pour "Von Allmen Nils". (mais ce n'est pas le seul problème)
 
Vous pouvez consulter/modifier la base à l'aide de l'interface (Firefox only) [... problème résolu ... supprimé pour des raisons de sécurité]
 
(data base sauvegardée vous pouvez y aller lol)
 
Vous pouvez essaier vos requêtes sur :
 
[... problème résolu ... supprimé pour des raisons de sécurité]
 
Merci infiniment à tout ceux qui pourront m'apporter des éléments de réponses. :love:


Message édité par CHli le 08-04-2005 à 11:08:55
Reply

Marsh Posté le 30-03-2005 à 11:26:39   

Reply

Marsh Posté le 31-03-2005 à 10:42:39    

snif personne :-|

Reply

Marsh Posté le 31-03-2005 à 12:02:38    

Quelle version de MySQL ?

Reply

Marsh Posté le 31-03-2005 à 15:28:02    

salut ratibus, la version installée est la 4.1.10-nt.
 

Reply

Marsh Posté le 31-03-2005 à 17:04:13    

Concentre toi sur un problème à la fois.
 
Les pénalités pour commencer ...
 
Donnes-nous le contenu de la table des joueurs et celui de la table des pénalités, et le résultat de la requête suivante :
 

Code :
  1. SELECT J.Jou_Nom,
  2.        J.Jou_Prenom,
  3.        J.Jou_Numero,
  4.        SUM(P.Pen_Duree) as NBPenalites
  5. FROM   joueurs as J
  6. LEFT OUTER JOIN penalites as P ON J.Jou_ID = P.Jou_IDE
  7. GROUP BY J.Jou_ID
  8. ORDER BY J.Jou_Nom;


Reply

Marsh Posté le 31-03-2005 à 19:15:59    

Code :
  1. SELECT J.Jou_Nom, J.Jou_Prenom, J.Jou_Numero, P.nb_penalites, M.nb_matchs, B.nb_buts
  2. FROM joueurs J
  3. LEFT JOIN
  4. ((
  5. SELECT Jou_IDE, SUM(Pen_Duree) AS nb_penalites
  6. FROM penalites
  7. GROUP BY Jou_IDE
  8. ) AS P) ON J.Jou_IDE=P.Jou_IDE
  9. LEFT JOIN
  10. ((
  11. SELECT Jou_IDE, COUNT(*) AS nb_matchs
  12. FROM nm_matchsjoueurs
  13. GROUP BY Jou_IDE
  14. ) AS M) ON J.Jou_IDE=M.Jou_IDE
  15. LEFT JOIN
  16. ((
  17. SELECT Jou_IDE, COUNT(*) AS nb_buts
  18. FROM buts
  19. GROUP BY Jou_IDE
  20. ) AS B) ON J.Jou_IDE=B.Jou_IDE


 
Si jamais tu dois utiliser une version de MySQL < 4.1, alors ils faut passer par des TEMPORARY TABLE (ça marche très bien ;)).
 
Dis moi si la requete passe (je peux pas tester mais ça doit être ça, aux erreurs de syntaxe près :D)


Message édité par ratibus le 31-03-2005 à 19:26:00
Reply

Marsh Posté le 31-03-2005 à 19:19:23    

merci pour toutes ces réponses je vais tester ça ce soir ! Merci infiniment !

Reply

Marsh Posté le 31-03-2005 à 19:59:48    

Merci infiniment à vous tous !  
 
La query finale est celle-ci :
 

Code :
  1. SELECT Jou.Jou_Nom, Jou.Jou_Prenom, Jou.Jou_Numero, Pen.nb_penalites, Mat.nb_matchs, But.nb_buts
  2. FROM joueurs Jou
  3. LEFT JOIN ((
  4. SELECT Jou_IDE, SUM(Pen_Duree) AS nb_penalites
  5. FROM penalites GROUP BY Jou_IDE) AS Pen)
  6. ON Jou.Jou_ID=Pen.Jou_IDE
  7. LEFT JOIN ((
  8. SELECT Jou_IDE, COUNT(*) AS nb_matchs
  9. FROM nm_matchsjoueurs GROUP BY Jou_IDE) AS Mat)
  10. ON Jou.Jou_ID=Mat.Jou_IDE
  11. LEFT JOIN ((
  12. SELECT Jou_IDE, COUNT(*) AS nb_buts FROM buts GROUP BY Jou_IDE) AS But)
  13. ON Jou.Jou_ID=But.Jou_IDE


 
y avait juste les Jou.Jou_IDE = xxx.Jou_IDE qui jouaient pas. Mais sinon impec !  
 
C'est la fête :)


Message édité par CHli le 31-03-2005 à 20:01:39
Reply

Marsh Posté le 31-03-2005 à 21:19:12    

il est fait avec quel logiciel ton diagrammae ?

Reply

Marsh Posté le 01-04-2005 à 10:02:54    

http://www.fabforce.net/dbdesigner4/
 
+ les liaisons à la main sous paint... lol (mais c parceque j'ai conçu la base à la main et que j'ai simplement importé par la suite dans DBDesigner en faisant un reverse engineering depuis la base mysql, sinon on peut tout faire avec ce programme.)


Message édité par CHli le 01-04-2005 à 10:08:52
Reply

Marsh Posté le 01-04-2005 à 10:02:54   

Reply

Marsh Posté le 01-04-2005 à 12:23:13    

Bon c'est pas tout à fait résolu encore en fait :) Et à nouveau je coince...  
 
Dans la query finale on utilise pour les statistiques tous les éléments de la base hors ce que je désire faire c'est utiliser uniquement les informations concernant les matchs s'étant déroulés durant la saison ayant un ID = x.
 
Dans la requête de ratibus (le sauveur) on fait des LEFT JOIN sur la table joueurs afin d'obtenir les différents éléments statistiques que je désire afficher.
 
Quelle syntaxe adopter pour limiter le groupe de résultats aux matchs s'étant disputé durant une saison ayant pour id = n.
 
C'est terrible pour moi ce SQL, je vois les intersections d'ensembles dans ma tête mais je n'arrive pas à les retranscrire en SQL. Va falloir que je me trouve un bon bouquin :)

Reply

Marsh Posté le 01-04-2005 à 13:28:50    

CHli a écrit :

Bon c'est pas tout à fait résolu encore en fait :) Et à nouveau je coince...  
 
Dans la query finale on utilise pour les statistiques tous les éléments de la base hors ce que je désire faire c'est utiliser uniquement les informations concernant les matchs s'étant déroulés durant la saison ayant un ID = x.
 
Dans la requête de ratibus (le sauveur) on fait des LEFT JOIN sur la table joueurs afin d'obtenir les différents éléments statistiques que je désire afficher.
 
Quelle syntaxe adopter pour limiter le groupe de résultats aux matchs s'étant disputé durant une saison ayant pour id = n.
 
C'est terrible pour moi ce SQL, je vois les intersections d'ensembles dans ma tête mais je n'arrive pas à les retranscrire en SQL. Va falloir que je me trouve un bon bouquin :)

Tu veux toujours tous les joueurs ?

Reply

Marsh Posté le 01-04-2005 à 15:23:26    

Oui, grand maitre SQL.

Reply

Marsh Posté le 01-04-2005 à 15:48:21    

:D
 

Code :
  1. SELECT J.Jou_Nom, J.Jou_Prenom, J.Jou_Numero, P.nb_penalites, M.nb_matchs, B.nb_buts
  2. FROM joueurs J
  3. LEFT JOIN
  4. ((
  5. SELECT Jou_IDE, SUM(Pen_Duree) AS nb_penalites
  6. FROM penalites
  7. JOIN matchs ON penalites.Mat_IDE=matchs.Mat_ID
  8. WHERE matchs.Sai_IDE=X
  9. GROUP BY Jou_IDE
  10. ) AS P) ON J.Jou_IDE=P.Jou_IDE
  11. LEFT JOIN
  12. ((
  13. SELECT Jou_IDE, COUNT(*) AS nb_matchs
  14. FROM nm_matchsjoueurs
  15. JOIN matchs ON nm_matchsjoueurs.Mat_IDE=matchs.Mat_ID
  16. WHERE matchs.Sai_IDE=X
  17. GROUP BY Jou_IDE
  18. ) AS M) ON J.Jou_IDE=M.Jou_IDE
  19. LEFT JOIN
  20. ((
  21. SELECT Jou_IDE, COUNT(*) AS nb_buts
  22. FROM buts
  23. JOIN matchs ON buts.Mat_IDE=matchs.Mat_ID
  24. WHERE matchs.Sai_IDE=X
  25. GROUP BY Jou_IDE
  26. ) AS B) ON J.Jou_IDE=B.Jou_IDE

Reply

Marsh Posté le 01-04-2005 à 16:51:33    

j'en ai rêvé il l'a fait :)
 
Merci ratibus !

Reply

Marsh Posté le 01-04-2005 à 20:49:21    

J'espère que tu as compris le principe ;)

Reply

Marsh Posté le 02-04-2005 à 01:25:51    

Je vais m'entrainer... mais une fois la requête formulée je comprend tout à fait son fonctionnement. Encore merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed