2

我有下表(user_record),其中包含数百万行,如下所示:

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

uid 可以重复。我需要的是显示前 10 条记录(需要包括 uid 和 s),没有重复的 uid 顺序按 s(desc)。我可以通过以下 SQL 语句中的两个步骤来做到这一点:

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

我只是想知道在一个语句中是否有更有效的方法?

任何帮助是极大的赞赏。

ps:我也有以下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

但它很慢

4

1 回答 1

2

最简单的方法是使用MAX()to get the highest sfor each 并根据最高对其进行uid排序s

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

上述查询的缺点是它不处理重复项,例如,如果有多个uid具有相同s的值并且结果是最高值。如果您想s通过重复获得最高值,您可以通过在子查询上计算它并将结果连接到原始表中来实现。

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
于 2013-03-18T14:23:56.930 回答