Problèmes avec plusieures requêtes...

Problèmes avec plusieures requêtes... - SQL/NoSQL - Programmation

Marsh Posté le 06-08-2007 à 00:44:25    

Bonjour à tous !  :)  
 
J'ai un problème avec plusieurs requêtes que je dois faire mais qui me paraissent tellement énorme que je ne sais pas par où commencer. Pour une meilleure compréhension, je vais illustrer mon propos.
 
J'ai une table nommé score. Cette table contient des scores, comme son nom l'indique. Dans cette table est enregistré des scores (non, sans blagues...  :p ).
 
Voici la structure de la table :
 
id/pseudo/console/jeu/score
 
- id est un champ en auto increment qui sert a differencier les performances, pseudo contient le pseudo de la personne qui a réalisé le score, console contient le nom de la console sur laquelle le score a été réalisé, jeu contient le jeu sur lequel le score a été réalisé et score contient... le score.
 
Dans cette table, il y a des centaines d'enregistrements. Il faut donc faire une requête pour trier les informations afin d'afficher ce que l'on veux.
 
Problèmes
 
- Comment faire pour afficher le nombre de fois ou le membre est premier sur un jeu ? ou deuxième ? ou troisième ?
 
- Comment faire pour calculer le nombre total de point d'un membre ?
Avec un barème de ce type : 1ère place = 10 points, 2ème place = 9 points, 3ème place = 8 points...
 
- Comment faire pour afficher le classement général de tous les joueurs ?
 
Je vous remercie d'avance de l'aide que vous allez m'apporter ou bien tout simplement d'avoir pris la peine de lire ce topic dans son entierté.
 
Si vous avez une questions car vous n'avez pas bien compris le problème ou si vous souhaitez plus d'explications, n'hésitez surtout pas.
 
Cordialement, Raul10.

Reply

Marsh Posté le 06-08-2007 à 00:44:25   

Reply

Marsh Posté le 06-08-2007 à 08:50:05    

en fait, as-tu un peu cherché par toi même ?
C'est pas trop l amentalité ici de filé direct la solution toute faite.
Sais-tu faire remonter les trois meilleurs résultats par jeu déjà ?

Reply

Marsh Posté le 06-08-2007 à 10:48:18    

jpcheck a écrit :

en fait, as-tu un peu cherché par toi même ?
C'est pas trop l amentalité ici de filé direct la solution toute faite.
Sais-tu faire remonter les trois meilleurs résultats par jeu déjà ?


 
Oui, je sais faire.
 
SELECT * FROM score WHERE jeu=''.$jeu'' ORDER BY score DESC LIMIT 0,3

Reply

Marsh Posté le 06-08-2007 à 11:01:32    

"Comment faire pour afficher le nombre de fois ou le membre est premier sur un jeu ?"
 
A l'arrache non testé:
 
Select count(*), pseudo as p from (select * from score where p = score.pseudo and score=(max(score)) )
 

Reply

Marsh Posté le 06-08-2007 à 11:54:28    

tu peux pas mettre max() dans la clause where. Par contre, tu peux la mettre dans le having

Reply

Marsh Posté le 06-08-2007 à 11:56:21    

rufo a écrit :

tu peux pas mettre max() dans la clause where. Par contre, tu peux la mettre dans le having


 
Je n'ai pas compris ce que tu veux dire...


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Marsh Posté le 06-08-2007 à 13:22:26    

ça : Select count(*), pseudo as p from (select * from score where p = score.pseudo and score=(max(score)) )
ça marche pas car on peut pas mettre la fonction max() dans la clause where. Par contre, on peut la mettre dans la clause having.
ex : Select count(*), pseudo as p from (select * from score where p = score.pseudo HAVING score=(max(score)))

Reply

Marsh Posté le 06-08-2007 à 13:29:45    

rufo a écrit :

ça : Select count(*), pseudo as p from (select * from score where p = score.pseudo and score=(max(score)) )
ça marche pas car on peut pas mettre la fonction max() dans la clause where. Par contre, on peut la mettre dans la clause having.
ex : Select count(*), pseudo as p from (select * from score where p = score.pseudo HAVING score=(max(score)))


 
J'ai une erreur avec ton code...


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Marsh Posté le 06-08-2007 à 13:32:14    

J'imagine que "score" ne contient pas un score, mais la position sur le podium (c'est à dire qu'on se fout que le joueur ait fait 84350 points à Super Mario, l'important c'est qu'il a le 3° meilleur score, et donc qu'on stocke 3)
 
Car si c'est pas ça, déjà je vois pas comment, sans notion de tournois, tu peux comparer les scores pour déduire si le joueur est premier ou second ( :heink: )
 
Ensuite, astuce simple pour compter des valeurs définies dans une table : un SUM() sur un DECODE() -pas de chance pour toi, en MySQL DECODE() n'existe pas, je te laisse te débrouiller tout seul avec un CASE à la place)
 

Code :
  1. SELECT pseudo, sum(decode(score, 1, 1, 0)) premier, sum(decode(score, 2, 1, 0)) second, sum(decode(score, 3, 1, 0)) troisieme, sum(decode(score, 1, 10, 2, 5, 3, 1, 0)) points
  2. FROM score
  3. WHERE jeu = :jeu
  4. GROUP BY pseudo
  5. ORDER BY points DESC


 
J'ai pris des libertées avec ton barème, je préfère 1° = 10 points, 2° = 5 points, 3° = 1 point, + = 0 points... C'est un peu plis fair play pour les joueurs qui jouent peu mais qui explosent les autres à chaque match.

Reply

Marsh Posté le 06-08-2007 à 13:34:05    

PS : Pourquoi tu parles de "plusieurs requêtes" ? Tu comptais faire 36 requêtes pour un résultat aussi basique ?

Reply

Marsh Posté le 06-08-2007 à 13:34:05   

Reply

Marsh Posté le 06-08-2007 à 13:36:45    

MagicBuzz a écrit :

J'imagine que "score" ne contient pas un score, mais la position sur le podium


 
Eh bien non, justement, score contient un score. C'est pour ça que cette requête est difficile à écrire.


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Marsh Posté le 06-08-2007 à 13:38:38    

Raul10 a écrit :

Eh bien non, justement, score contient un score. C'est pour ça que cette requête est difficile à écrire.


Impossible
 
 
A moins que "jeu" ne sois pas un "jeu" au sens "Super Mario", mais dans le sens "jeu" de tennis.
A ce moment, mise à part foutre la base par terre avec une usine à gaz, je vois pas trop comment tu peux faire.
 
Tu devrais commencer par stocker en plus la position sur le podium, là tu te lances dans un truc qui ne peux que foirer dès qu'il y aura quelques lignes dans ta base.

Reply

Marsh Posté le 06-08-2007 à 13:58:28    

Ah, si, je viens de comprendre...
 
C'est un stupide "Hall of Fame" que tu veux faire [:magicbuzz]
 
Je regarde ça quand j'ai 5 minutes

Reply

Marsh Posté le 06-08-2007 à 14:26:40    

MagicBuzz a écrit :

Ah, si, je viens de comprendre...
 
C'est un stupide "Hall of Fame" que tu veux faire [:magicbuzz]
 
Je regarde ça quand j'ai 5 minutes


 
 
Ok merci à toi.  :)


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Marsh Posté le 06-08-2007 à 14:30:04    

Mouais, ça me saoule ton truc. Avec MySQL il doit y avoir des merdes du genre "order_group" ou je ne sais quoi (qui permettrait de numéroter les résultats en fonction d'une clause de tri par rapport à un critère), donc je creuse pas plus avec Oracle, je sens que je vais y passer la nuit pour faire la même chose que deux lignes en MySQL

Reply

Marsh Posté le 06-08-2007 à 14:39:52    

MagicBuzz a écrit :

Mouais, ça me saoule ton truc. Avec MySQL il doit y avoir des merdes du genre "order_group" ou je ne sais quoi (qui permettrait de numéroter les résultats en fonction d'une clause de tri par rapport à un critère), donc je creuse pas plus avec Oracle, je sens que je vais y passer la nuit pour faire la même chose que deux lignes en MySQL


 
Bah de toute façon c'est avec Mysql qu'il faut faire...


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Marsh Posté le 06-08-2007 à 14:55:44    

D'où la raison de mon abandon :p

Reply

Marsh Posté le 06-08-2007 à 15:11:30    

MagicBuzz a écrit :

D'où la raison de mon abandon :p


 
Ok, merci quand même.


---------------
Raul, le meilleur joueur de tous les temps !
Reply

Sujets relatifs:

Leave a Replay

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