5

「トップ 3 スコア」リーダーボードを作成しています。上位 3 つのスコアを表示して、1 人あたりの最大値を描画したいのですが、上位 3 つのスコアを持つ人を表示したいので、3 に制限したくありません。たとえば、以下のデータでは、

+----+-----+
|Name|Score|
+----+-----+
|Matt|   17|
|Mark|   29|
|Luke|   28|
|John|   29|
|Paul|   27|
|Matt|   29|
|Mark|   22|
+----+-----+

表示したい:

+------+-----+
|Name  |Score|
+------+-----+
|1.Matt|   30|
|2.Mark|   29|
|2.John|   29|
|3.Luke|   28|
+------+-----+

私の最初の考えは、全員の最大値を抽出し、スコアが変更された後に表示を停止することです (PHP を使用)。

select name, max(score)
from SCORES
group by name
order by name

これをSQLで直接行う方法はありますか?

4

6 に答える 6

6
SELECT name, score
FROM SCORES
JOIN (SELECT distinct score score3
      FROM scores
      ORDER BY score DESC
      LIMIT 2, 1) x
ON score >= score3
ORDER by score DESC

フィドル

于 2013-06-01T08:52:19.603 に答える
1
SELECT  Name, MAX(Score) Score
FROM    TableName a
WHERE   EXISTS
        (
            SELECT  1
            FROM    TableName b
            WHERE   a.Score = b.Score
            GROUP   BY Score
            ORDER   BY Score DESC
            LIMIT   3
        )
GROUP   BY Name
ORDER   BY Score DESC

上記のレコードに基づく OU​​TPUT

╔══════╦═══════╗
║ NAME ║ SCORE ║
╠══════╬═══════╣
║ Mark ║    29 ║
║ John ║    29 ║
║ Matt ║    29 ║
║ Luke ║    28 ║
║ Paul ║    27 ║
╚══════╩═══════╝
于 2013-06-01T08:47:30.367 に答える
1

これが SQL FIDDLEです。

SELECT
  NAME,
  score
FROM SCORES
WHERE FIND_IN_SET(score,(SELECT
                           SUBSTRING_INDEX(GROUP_CONCAT( DISTINCT score ORDER BY score DESC),',',3)
                         FROM SCORES)) > 0
ORDER BY score desc
于 2013-06-01T10:22:58.350 に答える