Проблема с запросом MySQL для таблицы рекордов - PullRequest
0 голосов
/ 24 июля 2010

У меня есть таблица рекордов MySQL для игры, которая показывает ежедневный рекорд для каждого из последних дней года. Сейчас я делаю цикл for for PHP и делаю отдельный запрос для каждого дня, но таблица становится слишком большой, чтобы сделать это, поэтому я хотел бы сжать ее в один простой оператор MySQL.

Вот мой новый запрос прямо сейчас (date_submitted - отметка времени):

SELECT date(date_submitted) as subDate, name, score FROM highScores WHERE date_submitted > "2009-07-16" GROUP BY subDate ORDER BY subDate DESC, score DESC LIMIT 10;

выход:

+------------+------------+--------+
| subDate    | name       | score  |
+------------+------------+--------+
| 2010-07-18 | krissy     | 959976 |
| 2010-07-10 | claire     | 260261 |
| 2010-07-05 | krissy     | 771416 |
| 2010-06-19 | krissy     | 698031 |
| 2010-06-18 | otli       | 264898 |
| 2010-06-15 | robbie     |  82303 |
| 2010-06-01 | dad        | 480469 |
| 2010-05-29 | vicente    | 124149 |
| 2010-05-27 | dad        | 564007 |
| 2010-05-26 | caleb      | 502623 |
+------------+------------+--------+

Моя проблема в том, что когда он группировался по subDate, он получал наивысшую оценку за самую раннюю временную отметку того дня, как вы можете видеть в следующем запросе:

SELECT name, score, date_submitted FROM highScores WHERE date(date_submitted)='2010-06-15' GROUP BY name ORDER BY score DESC;

выход:

+--------+--------+---------------------+
| name   | score  | date_submitted      |
+--------+--------+---------------------+
| john   | 304095 | 2010-06-15 22:58:02 |
| april  | 247126 | 2010-06-15 21:25:31 |
| orli   | 166021 | 2010-06-15 21:25:31 |
| robbie |  82303 | 2010-06-15 11:38:39 |
+--------+--------+---------------------+

Как видите, бедный Джон должен был быть лидером на 2010-06-15 годы. Кто-нибудь может помочь? Надеюсь, это что-то очень простое, что я пропускаю. Я пытался использовать max (оценка) перед частью FROM в 1-м запросе, и это дало мне правильную оценку, но не перенесло имя.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 24 июля 2010
SELECT userName, userScore, subDate FROM (
    SELECT 
        userName,
        userScrore,
        DATE(submitDate) as subDate,
        @rn := CASE WHEN @subDate = DATE(submitDate)
                THEN @rn + 1
                ELSE 1
           END AS rn,
        @subDate := DATE(submitDate)
    FROM (SELECT @subDate := NULL) vars, highScores
    ORDER BY submitDate, userScore DESC
) deriv
WHERE rn=1;

См. Также ответ на другой 'самый высокий показатель за что-то' - вопрос

0 голосов
/ 24 июля 2010

Добавьте

ORDER BY userScore DESC 

в конце второго запроса.

...