2008-09-23 9 views
1

J'ai une application qui suit les meilleurs scores dans un jeu.Sélection de valeurs groupées à un identificateur spécifique

J'ai un user_scores table qui mappe un user_id à un score.

Je dois retourner les 5 meilleurs scores, mais seulement 1 meilleur score pour spécifique utilisateur.

Donc, si l'utilisateur X a les 5 scores les plus élevés sur une base purement numérique, je retourne simplement le plus élevé puis les 4 prochains scores de l'utilisateur.

J'ai essayé d'utiliser:

SELECT user_id, score 
FROM user_scores 
ORDER BY score DESC 
GROUP BY user_id 
LIMIT 5 

Mais il semble que MySQL abandonne toute user_id avec plus de 1 score.

Répondre

6

Cela devrait fonctionner:

SELECT user_id, MAX(score) 
FROM user_scores 
GROUP BY user_id 
ORDER BY MAX(score) DESC 
LIMIT 5 
+0

battu par 27 secondes! – Swati

+0

Je pense qu'il devrait être effectivement "ORDER BY score DESC" - mais merci, a obtenu un traitement. –

+0

Je n'ai pas mysql à portée de main, mais AFAIR vous ne pouvez pas ORDER BY une colonne non agrégée. –

0

Vous ne pouvez regrouper par sans un résumé de la fonction (SUM, COUNT, etc.)

La clause GROUP BY dit comment regrouper les SUM ou COUNT.

Si vous voulez simplement diviser la longue liste en paquets avec une valeur commune, ce n'est pas SQL. C'est ce que votre application doit faire.

+0

Vous pouvez en MySQL. Comme l'affiche originale trouvée, MySQL saisit simplement une valeur possible aléatoire pour la colonne qui n'est pas groupée. Je pense que c'est une erreur très dangereuse avec beaucoup de potentiel pour dire accidentellement ce que vous ne vouliez pas dire. – user11318

+0

Yup. C'est une "caractéristique" non-standard qui équivaut à un bug. –

0

Pouvez-vous utiliser l'opérateur Distinct dire

SELECT DISTINCT(user_id), score 
FROM user_scores 
ORDER BY score DESC 
LIMIT 5 

n'a pas testé donc pas sûr si cela va certainement travailler

0

De retour que le maximum score pour un utilisateur donné est quelque chose comme ce qui suit.

SELECT user_id, max(score) FROM user_scores 
GROUP BY user_id 
1
SELECT user_id, MAX(score) AS score 
FROM user_scores 
GROUP BY user_id 
ORDER BY score DESC 
LIMIT 5 

devrait faire le travail pour vous ... mais il ne faut pas oublier de créer des index ...

0

Je ne sais pas si c'était un manque de caféine ou tout simplement une explosion du cerveau , mais les réponses ici étaient si faciles.

En fait, je travaille avec elle a obtenu cette monstruosité:

SELECT s1.user_id, 
    (SELECT score FROM user_scores s2 WHERE s2.user_id = s1.user_id ORDER BY score DESC LIMIT 1) AS score 
FROM user_scores s1   
GROUP BY s1.user_id 
ORDER BY s1.score DESC   
LIMIT 5 
+0

C'est une monstruosité! – Mez

Questions connexes