8719 sujets

Développement web côté serveur, CMS

Bonsoir tout le monde,

Depuis des heures je tente d'optimiser une requête.. en vain. Comme je ne suis pas bon, j'en viens à me demander s'il est possible d'en faire quelque chose. Je sollicite donc votre aide.

Voici à quoi ressemble ma table "classements" :

upload/20801-tableaures.jpg

Le but est d'arriver à un résultat affiché de ce type :

upload/20801-tableaucla.jpg

J'y parviens actuellement en faisant une première requête qui permet de déduire les login classés par classement général, puis une seconde requête qui dans une boucle liste tout ce qui concerne le login en question.

Est-il possible d'optimiser tout ça ? Merci d'avance pour votre aide.
Modifié par Bertrand40 (27 Dec 2014 - 23:19)
Bonsoir,

C'est quoi un "login" ? C'est un utilisateur, un coureur ?
J'ai l'impression que tu n'as pas bien modélisé tes tables. J'imagine qu'il te faut 2 tables. Une login et une autre course.
La requête se fera alors via une jointure.
Bonjour,

"login" représente un joueur.

Après chaque course, une ligne est remplie concernant ce joueur, contenant
- son nom (login),
- les points qu'il a marqués à cette course,
- son nombre total de points sur l'ensemble des courses,
- et son classement général.

En l'état voici ce que je fais :


$req = $bdd->prepare('
SELECT login, classementGeneral FROM classements
ORDER BY classementGeneral ASC
');

$req->execute();

while ($donnees = $req->fetch()){
$req2 = $bdd->prepare('
SELECT  course, points, pointsTotaux FROM classements
WHERE login = $donnees['login']
');

$req2->execute();

// AFFICHAGE
}

$req->closeCursor();


L'imbrication des boucles m'a l'air pas très catholique. D'autant qu'il en existe d'autres, non marquées ici, destinées à récupérer des valeur max/min par course, absolues..
Modifié par Bertrand40 (28 Dec 2014 - 09:55)
Dans l'idéal tu devrais avoir :

Une table joueur comprenant :
- id
- nom
- classementGeneral
- pointsTotaux

Une table course comprenant :
- id
- nom

Et une autre table points comprenant :
- id
- joueur_id
- couse_id
- points

Pour éviter les requêtes imbriquées qui ne sont pas efficaces, il faut que tu fasse des jointures :

SELECT joueur.nom, joueur.classementGeneral, joueur.pointsTotaux, course.nom AS course, points.points
FROM joueur
INNER JOIN points
ON joueur.id = points.joueur_id
INNER JOIN course
ON course.id = points.course_id
OEDER BY classementGeneral ASC
Bonsoir Benj,

Désolé pour le retard, je crois que ce sujet m'a tellement pris la tête, que j'ai eu inconsciemment besoin de l'oublier..

Je connais les jointures mais pour construire une base, c'est autre chose. Et c'est sans parler des index, et autres optimisations nécessaires. Bref.

Ok concernant ton approche, je vais donc scinder tout ce que j'ai pour alléger le temps d'affichage.

Il y a une chose que je ne saisis pas :

INNER JOIN points
ON joueur.id = points.joueur_id
INNER JOIN course
ON course.id = points.course_id


Cette partie est donc sensée me ramener pour chaque joueur (préalablement ordonné en fonction de son classement général) une ligne contenant l'ensemble de ses points à toutes les courses ? C'est bien ça ?