2010-01-17 6 views
2

Disons que j'ai la table des scores suivants (rows total de 10):mysql: requête pour retourner scores classe selon un utilisateur spécifique

rank userid score 
---- ------ ----- 
1 |455 |10 
2 |435 |9 
3 |354 |8 
4 |342 |7 
5 |343 |6 
6 |123 |5 
7 |125 |4 
8 |128 |3 
9 |5  |2 
10 |6  |1 

l'utilisateur peut récupérer son statut de score, et il peut obtenir 5 marquer des positions autour de sa position. ce qui signifie:

  1. si l'utilisateur est à la 1ère place, il obtiendra les résultats des rangs 1-5
  2. si l'utilisateur est à la 6e place, il obtiendra les résultats des rangs 4-9
  3. si l'utilisateur est à la 9e place, il obtiendra les résultats de rang 6-10

J'essaie de trouver la méthode la plus optimisée pour effectuer ces opérations pour obtenir le statut de score pour l'utilisateur seulement SQL, aucune autre intégration de langage.

merci beaucoup !!!

mise à jour

ce tableau est en fait créé sur la volée

j'ai une table game_log avec gameid, userid et le temps et LOGID (qui est playid) et j'ai table game_score avec LOGID et But.

i utiliser la requête suivante:

@rank:=0; 

select @rank:[email protected]+1 as rank,userid,score from (
select * from (
    select game_log_gameid as gameid, 
    game_log_userid as userid, 
(select max(game_score_log_score) 
     from game_score_log where game_score_log_logid=game_log_id) as score, 
     (select game_score_log_timestamp as time from 
      game_score_log where game_score_log_logid=game_log_id and 
      game_score_log_score = score order by game_score_log_timestamp desc) 
      as time from game_log 
where game_log_gameid=620 
order by score desc,time 
) as a group by gameid,userid) as b order by score desc,time 
+0

Quelle quantité de la table ci-dessus est produite dynamiquement via la requête? C'est-à-dire: y a-t-il vraiment un champ «rank» dans le tableau ou est-ce produit à la volée? –

+0

le grade est produit à la volée. Je vais modifier le post principal pour ajouter cette information – ufk

Répondre

1

Je ne suis pas sûr qu'il fait beaucoup de sens pour tenter de faire tout cela en une seule requête, que vous auriez besoin d'un sous-select ou quelque chose de similaire pour obtenir le rang de l'utilisateur que vous pourriez ensuite calculer les limites autour. Il est donc plus logique d'obtenir le rang de l'utilisateur avec une seule requête, de calculer les limites que vous voulez obtenir dans votre langage de programmation source (la gestion des bords sera beaucoup plus facile ici que dans SQL), puis émettre une requête simple qui utilise LIMIT pour obtenir les données requises.

Par exemple, une fois que vous avez calculé « startRank » comme ci-dessus, vous devriez simplement utiliser:

SELECT * FROM table_name WHERE rank >= startRank ORDER BY rank ASC LIMIT 5; 

Mise à jour: Cela ne fait pas tout à fait autant de sens maintenant que vous J'ai découvert que le rang est calculé dynamiquement, mais le point général que je faisais est toujours valide - la gestion de cas de bords tels que les positions finales initiales sera beaucoup plus facile dans un langage de programmation que dans SQL.

+0

en fait, je suis déjà en utilisant la solution que vous avez fourni ici. Je calcule d'abord le rang de l'utilisateur puis je récupère les lignes correspondantes. J'essayais de savoir s'il y avait un moyen plus optimisé. – ufk

+0

Je serais surpris si le résultat SQL n'était pas si tortueux que d'être un cauchemar de maintenance si vous avez besoin de modifier les choses plus tard. Cela dit, j'espère que quelqu'un là-bas va prouver le contraire.:-) –

+0

Je sais qu'il sera plus facile de le faire dans un langage de programmation que dans mysql, le problème est que pour que je puisse le faire, il faudra que je récupère toutes les lignes pour les calculer et ça peut être un très longue table. – ufk

Questions connexes