0

このようなテーブルの場合:

username        | time
---------------------------------------
animuson        | 0.678
aP*animuson     | 0.967
animuson        | 0.567
qykumsoy        | 0.876

MySQLでこれらを時間順に並べてから、ユーザー名が発生し、ユーザー名が1回だけカウントされる位置を見つけようとしています。したがって、ユーザー名「qykumsoy」を検索すると、2が返されるはずです。これは、両方の「animuson」時間が高速ですが、最も速いものだけがカウントされるため、「qykumsoy」が次に速くなります。それらをグループ化して並べ替えることはできますが、そのユーザー名がどの位置にあるかを確認するにはどうすればよいですか?MySQLでこれを行うだけで、PHPのすべての結果をループするよりも高速になる可能性があると考えました。間違っている場合は、修正してください。

私がこれまで考えてきたこと:

SELECT * FROM `times` ORDER BY MIN(`time`) GROUP BY `username`

私はMySQLの経験があまりなく、基本的なものだけです。何か案は?

4

1 に答える 1

0

あなたが求めているのは、テーブル内のデータに関連するランクです-MySQLにはランキング/分析/ウィンドウ機能はありませんが、2つのオプションがあります-これ:

SELECT x.rank
   FROM (SELECT t.username, 
                         t.time,
                         (SELECT COUNT(*)
                              FROM TABLE y
                             WHERE y.time <= t.time) AS rank
                 FROM TABLE t) x
 WHERE x.username = 'qykumsoy'

...または変数を使用する:

SELECT x.rank
   FROM (SELECT t.username, 
                         t.time,
                         @rownum := @rownum + 1 AS rank
               FROM TABLE t
                  JOIN (SELECT @rownum := 0) r
         ORDER BY t.time DESC) x
 WHERE x.username = 'qykumsoy'
于 2010-07-27T02:51:04.470 に答える