Топ 3 Scores - MySQL

Я строй «Top 3 бала» Leaderboard. Я хачу, каб адлюстраваць тры верхнія ацэнкі, выкарыстоўваючы максімальную на чалавека, але я не хачу, каб абмежаваць 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
@AdamGent Вы думаеце, што табліца тэмпературы лепш, чым укладзены запыт, як і ўсе іншыя адказы, якія былі апублікаваныя?
дададзена аўтар Barmar, крыніца
Калі б я не быў на маім тэлефоне, я б адказаў, але так, як я б я гэта selet топу-3 розных лікавыя scoresscores і змясціць іх у табліцы TMP затым далучыцца да гэтай табліцы TMP ў выбраным, як і вышэй.
дададзена аўтар Adam Gent, крыніца
Суб запыт табліцы TMP :) і я меў на ўвазе ці я проста не магу друкаваць на маім iPhone
дададзена аўтар Adam Gent, крыніца

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

FIDDLE

6
дададзена
Гэта ўзрушаюча. Дзякуй!
дададзена аўтар Bruise, крыніца
SELECT name,score
    FROM SCORES
    WHERE score in (
        SELECT distinct s.score
        FROM SCORES as s
        ORDER BY s.score desc
        LIMIT 3)
    )
    ORDER BY score
2
дададзена
Зрушэнне кампанент LIMIT 0 на аснове, так вы з дапамогай 1.
дададзена аўтар Barmar, крыніца
@Barmar вы маеце рацыю. Проста атрымаць топ 3.
дададзена аўтар JamesN, крыніца

Вось <�моцны> 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
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

ВЫСНОВА на падставе запісаў, прыведзеных вышэй

╔══════╦═══════╗
║ NAME ║ SCORE ║
╠══════╬═══════╣
║ Mark ║    29 ║
║ John ║    29 ║
║ Matt ║    29 ║
║ Luke ║    28 ║
║ Paul ║    27 ║
╚══════╩═══════╝
1
дададзена

Я хацеў бы паспрабаваць нешта накшталт:

SELECT * FROM mytable
WHERE score IN (SELECT DISTINCT score FROM mytable ORDER BY score DESC LIMIT 3)
ORDER BY score DESC
1
дададзена
Няслушныя тыпы катыровак
дададзена аўтар Barmar, крыніца
3 нізкія балы?
дададзена аўтар Joachim Isaksson, крыніца
вы пр сінтаксічнай памылкі ў кодзе, WHERE павінен прыйсці першым перад ЗАГАД , другі, калі вы выправіць гэта, вы атрымаеце паведамленне пра памылку MySQL яшчэ не падтрымлівае " мяжа & IN/ALL/ANY/SOME подзапросов
дададзена аўтар John Woo, крыніца
фіксаваны - дзякуй: дададзеная DESC, дзе гэта неабходна
дададзена аўтар Ron.B.I, крыніца
Я не ўпэўнены, што гэта MySQL канкрэтнае пытанне, і я не ведаю, што гэта абмежаванне на іншыя прыкладання SQL.
дададзена аўтар Ron.B.I, крыніца

гэта дасць першыя тры ацэнкі, незалежна ад сувязяў.

ВЫБАР адзнака FROM туЬаЫе групы па ліку ORDER BY Лік DESC межах 3

зараз атрымаць трэці рахунак.

SELECT MIN ( рахункі ') FROM (SELECT адзнака FROM туЬаОго групы па ліку ORDER BY score` DESC Межах 3) у якасці top3

нарэшце, атрымаць усе роўныя або вышэй трэцяга бала

SELECT * FROM mytable WHERE score' >= (SELECT MIN(score') FROM (SELECT score FROM mtyable group by score' ORDER BYscore` DESC LIMIT 3) as top3)

1
дададзена