2013-03-18 3 views
1

je le tableau suivant (user_record) avec des millions de lignes comme ceci:MySQL sélectionner dix enregistrements sans double uid

no uid s 
================ 
1  a 999 
2  b 899 
3  c 1234 
4  a 1322 
5  b 933 
----------------- 

Le uid peut être double .Quel j'ai besoin est de montrer les dix premiers dossiers (besoin inclus uid et s) sans duplication de commande par s (desc). Je peux le faire par deux étapes dans les instructions SQL suivantes:

SELECT distinct(uid) FROM user_record ORDER BY s DESC LIMIT 10 
SELECT uid,s FROM user_record WHERE uid IN(Just Results) 

Je viens WANA sais est-il un peu de manière plus efficace dans une déclaration?

Toute aide est grandement appréciée.

ps: J'ai aussi suite à l'instruction SQL:

select * from(select uid,s from user_record order by s desc) as tb group by tb.uid order by tb.s desc limit 10 

mais il est lent

Répondre

1

Le plus simple serait en utilisant MAX() pour obtenir le meilleur s pour chaque uid et ont réglé en fonction de la plus haute s.

SELECT uid, MAX(s) max_s 
FROM TableName 
GROUP BY uid 
ORDER BY max_s DESC 
LIMIT 10 

L'inconvénient de la requête ci-dessus est qu'il ne gère pas les doublons si, par exemple, il existe plusieurs uid qui ont le même s et se révèlent être la valeur la plus élevée . Si vous souhaitez obtenir la valeur s la plus élevée en double, vous pouvez le faire en le calculant sur la sous-requête et en joignant le résultat sur la table d'origine.

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT DISTINCT s 
      FROM TableName 
      ORDER BY s DESC 
      LIMIT 10 
     ) b ON a.s = b.s 
ORDER BY s DESC 
Questions connexes