2010-07-24 4 views
0

J'ai une table de scores élevés pour MySQL pour un jeu qui montre le meilleur score quotidien pour chacun des derniers jours de l'année. En ce moment je fais une boucle for-PHP et fais une requête séparée pour chaque jour, mais la table devient trop grande pour faire cela donc je voudrais la condenser en une simple déclaration MySQL.Problème avec la requête MySQL pour le classement des meilleurs scores

Voici ma nouvelle requête en ce moment (date_submitted est un horodatage):

SELECT date(date_submitted) as subDate, name, score FROM highScores WHERE date_submitted > "2009-07-16" GROUP BY subDate ORDER BY subDate DESC, score DESC LIMIT 10; 

sortie:

+------------+------------+--------+ 
| subDate | name  | score | 
+------------+------------+--------+ 
| 2010-07-18 | krissy  | 959976 | 
| 2010-07-10 | claire  | 260261 | 
| 2010-07-05 | krissy  | 771416 | 
| 2010-06-19 | krissy  | 698031 | 
| 2010-06-18 | otli  | 264898 | 
| 2010-06-15 | robbie  | 82303 | 
| 2010-06-01 | dad  | 480469 | 
| 2010-05-29 | vicente | 124149 | 
| 2010-05-27 | dad  | 564007 | 
| 2010-05-26 | caleb  | 502623 | 
+------------+------------+--------+ 

Mon problème est que quand il regroupées par SUBDATE, il a le meilleur score l'horodatage le plus tôt de ce jour, comme vous pouvez le voir dans la requête suivante:

SELECT name, score, date_submitted FROM highScores WHERE date(date_submitted)='2010-06-15' GROUP BY name ORDER BY score DESC; 

sortie:

+--------+--------+---------------------+ 
| name | score | date_submitted  | 
+--------+--------+---------------------+ 
| john | 304095 | 2010-06-15 22:58:02 | 
| april | 247126 | 2010-06-15 21:25:31 | 
| orli | 166021 | 2010-06-15 21:25:31 | 
| robbie | 82303 | 2010-06-15 11:38:39 | 
+--------+--------+---------------------+ 

Comme vous pouvez le voir, le pauvre John aurait dû être le leader pour 2010-06-15. Quelqu'un peut-il aider? J'espère que c'est quelque chose de vraiment simple que je néglige. J'ai essayé d'utiliser max (score) avant la partie FROM dans la première requête et il m'a donné le score correct mais n'a pas reporté le nom.

Nous vous remercions de votre aide.

Répondre

0
SELECT userName, userScore, subDate FROM (
    SELECT 
     userName, 
     userScrore, 
     DATE(submitDate) as subDate, 
     @rn := CASE WHEN @subDate = DATE(submitDate) 
       THEN @rn + 1 
       ELSE 1 
      END AS rn, 
     @subDate := DATE(submitDate) 
    FROM (SELECT @subDate := NULL) vars, highScores 
    ORDER BY submitDate, userScore DESC 
) deriv 
WHERE rn=1; 

Voir aussi la réponse à une autre 'highest record per something'-question

+0

Salut, merci. C'est au-delà de mon expérience MySQL mais je pense que je commence à le comprendre. Cependant, quand je lance ce à partir de la ligne de commande MySQL: SELECT name, score, SUBDATE FROM (SELECT nom, le score , DATE (date_submitted) AS SUBDATE, @rn ..... etc. .. -je obtenir cette erreur: erreur 1064 (42000): Vous avez une erreur dans votre syntaxe SQL, consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « SELECT nom, partition , DATE (date_submitted) AS 'à la ligne 2 – peterangler

+0

Hey merci. Je l'ai juste réessayé et l'ai réécrit au lieu de copier-coller et ça a marché! L'erreur que je recevais était un chariot de ligne d'espace supplémentaire ou quelque chose de la copie. – peterangler

0

Ajouter un

ORDER BY userScore DESC 

à la fin de la deuxième requête.

+0

je mets « ORDER BY partition DESC » à la fin de la deuxième requête. Donc, cette requête est trier correctement. – peterangler

+0

J'ai juste essayé de changer "score DESC" pour "marquer ASC" dans la première requête juste pour voir si elle a reconnu la 2ème partie de la commande et il m'a donné exactement la même sortie dans la première requête donc c'est bizarre. – peterangler

+0

il semble qu'il a corrigé la deuxième sortie, à moins que je me trompe. – JNK

Questions connexes