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を含む必要があります)をs(desc)による重複するuidの順序なしで表示することです。これは、次のSQLステートメントの2つの手順で実行できます。

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

1つのステートメントにもう少し効率的な方法があることを知っていますか?

どんな助けでも大歓迎です。

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()の最高値を取得し、最高値に基づいて並べ替えることです。suids

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 に答える