Coup de main sur du SQL

  • Auteur de la discussion Auteur de la discussion Kent
  • Date de début Date de début
Nouveau WRInaute
Bonjour, je suis confronté à un soucis lors d'une requete sql.
Je travail sur un site où les membres peuvent jouer et acceder à un classement voici mes tables dont j'ai besoin pour la requête.

ga_jeux : cette table contient la liste des jeux disponibles. elle est consituté de deux colonne, idjeu et nom

| idjeu | nom |

ga_scores : cette table contient tout les scores effectué par les joueurs et se presente sous la structure suivante.

| idscore | idjeu | idmembre | score | timeStamp |

idscore sert à identifier le score dans la table rien de plus.
idjeu pour associer ce score à tel ou tel jeux (equivalent d'une clef etrangere qui correspond à la clef primaire de la table ga_jeux.
idmembre pour associer le score "idscore" effectué sur le jeu "idjeu" au membre "idmembre" . La colonne idmembre peut etre assimilé à une clef etrangere correspondante à la clef primaire de la table ga_membres.
Le score, score du joueur pour ce jeu
Le timeStamp , pour savoir quand le joueur as joué à un jeu pour la derniere fois.

Voici enfin la table ga_membres

| idmembre | pseudo |

idmembre , clef primaire identifiant unique du membre
pseudo, pseudonyme du membre.


Ce que je souhaieterai c'est, afficher pour chaque jeux dans un ordre de score decroissant les membre y ayant joué ainsi que leur score.

Voici un exemple de resultat :

[ --- Tetris --- ]
Joueur | Score
Kent 3000
Arthur 2390
Robert 200

Ceci est un exemple pour 1 jeu, ce que je voudrais c'est faire ceci pour tout les jeux dont l'id est present dans la table ga_scores

Merci pour vôtre aide.

PS : je n'ai pas trouvé de forum "SQL" j'espere que je post au bon endroit.
 
WRInaute discret
salut

Tu dois pouvoir effectuer une requète SQL de la sorte :

Code:
SELECT A.score, B.nom, C.pseudo  FROM ga_scores as A 
LEFT JOIN ga_jeux as B ON A.idjeu = B.idjeu 
LEFT JOIN ga_membres as C ON C.idmembre = A.idmembre 
ORDER BY B.nom ASC, A.score DESC

Ensuite, dans ta boucle qui parcoure le résultat, il te suffit de mettre en place un algorithme de rupture sur chaque jeux (et eventuelement limiter les résultats par jeux.

fab
 
WRInaute discret
Si j'ai bien compris tu veux afficher tous les scores de tous les jeux en une seule requete.

Je ferais comme ça :

Select ga_jeux.nom, ga_scores.score, ga_membres.pseudo
From ga_jeux
inner join ga_scores on ga_jeux.idjeu = ga_scores.idjeu
inner join ga_membres on ga_scores.idmembre = ga_membres.idmembre
Order by ga_jeux.nom asc, ga_scores.score desc

Ca va te sortir ça normalement :

Bomberman Kent 3000
Bomberman Arthur 2390
Bomberman Robert 150
Tetris Kent 3000
Tetris Arthur 2390
Tetris Robert 150
 
Nouveau WRInaute
Attention cependant, il est parfois plus performant de faire plusieurs requetes mono-table plutot qu'une seule multitable avec des jointures etouetou ( question de produit cartésien )
 
WRInaute discret
gabriel_f a dit:
Attention cependant, il est parfois plus performant de faire plusieurs requetes mono-table plutot qu'une seule multitable avec des jointures etouetou ( question de produit cartésien )
Tu aurais des exemples ?

fab
 
Nouveau WRInaute
Oui c'est sur, pour une question d'optimisation mieux vaux faire plusieurs requetes simple qu'un grosse qui metteré le serveur à genoux. Mais le site est encore e ndeveloppement je verrais suivant sont succés (si succés il y à...)
 
WRInaute discret
Kent a dit:
Oui c'est sur, pour une question d'optimisation mieux vaux faire plusieurs requetes simple qu'un grosse qui metteré le serveur à genoux. Mais le site est encore e ndeveloppement je verrais suivant sont succés (si succés il y à...)

C'est tout le contraire. enfin ....

fab
 
Nouveau WRInaute
Ben soit on multiplie les requête soit on on l'allourdie. Aprés c'est un choix suivant la configuration du serveur etc , me trompe-je ? :oops:
 
Nouveau WRInaute
La "grosse requete" ne mettra pas forcement le serveur a genoux et ne sera pas forcement meilleure que plusieurs petites, cest a toi de faire des tests pour voir ce que ca donne.

Doit y avoir une regle speciale permettant de le determiner mais je ne suis pas assez performant en base de données pour te la donner :)

Sinon pour illustrer le produit cartesien de maniere brute.

Si je fais ma requete jointe dans deux tables d'1M d'enregistrement chaqune, et que je me debrouille mal en terme de tuning de la requete ( ordre des index, ordre des elements discriminants etc...),
ca donne table1*table2 soit un recordset d'1miliard de lignes ...

Bon ok, on est plus au 14eme siecle, et les base de données gèrent ca tres bien , cependant je maintiens que dans certains cas, il est plus performant de faire plusieurs petites requetes.
Faut bencher quoi ...
 
WRInaute discret
Pour un résultat identique, une seule et unique (même TRES GROSSE) requète vaudra toujours mieux que plusieurs et ce, pour toute base de données SQL.

Si quelqu'un a un contre-exemple concret (mesure de performance à l'appui), je serai curieux de voir ça ...

fab
 
Nouveau WRInaute
J'en ai pas, mais j'ai des experts de l'optimisation qui me confirment que c'est bien du cas par cas , le mieux cest ce qui scanne le moins de rows point.

Donc a toi d'analyser.

Pour des benchmarks cest tout simplement introuvable sur le net.Puisque c'est du cas par cas, ca sert juste a rien de comparer...
 
WRInaute discret
Le mieux c'est pas de faire une "grosse" requête dès le départ et après tu stockes ça dans un ou plusieurs variables que tu traites plus bas dans le code de la page ?
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut