我有下表(user_record),其中有数百万行,如下所示:
no uid s
================
1 a 999
2 b 899
3 c 1234
4 a 1322
5 b 933
-----------------
uid可以重复。我需要的是显示前十条记录(需要包括uid和s),并且按s(desc)排序,没有重复的uid顺序。我可以通过以下 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
但是速度很慢
最佳答案
最简单的方法是使用 MAX()
获取每个 uid
的最高 s
并根据最高的 进行排序>s
.
SELECT uid, MAX(s) max_s
FROM TableName
GROUP BY uid
ORDER BY max_s DESC
LIMIT 10
上述查询的缺点是,如果有多个 uid
具有相同的 s
并且结果是最高的,它不会处理重复项值(value)。如果您想获得重复的最高值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
关于MySQL选择没有重复uid的前十条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15479100/