2014-02-10 1 views
0

Кто-нибудь знают, как я могу получить дату, которая соответствует максимальному количеству баллов за game_id, на уровень пожалуйста:SQL: выбрать максимальное значение из колонки вместе с соответствующей датой

---------------------------------------- 
|id |game_id |level |score |date  | 
---------------------------------------- 
|1 |0  |1  |90 |1391989720 | 
|1 |0  |1  |95 |1391989721 | 
|1 |1  |1  |4  |1391989722 | 
|1 |1  |1  |8  |1391989723 | 
|1 |1  |2  |6  |1391989724 | 
---------------------------------------- 

Благодарность человек, должен был проверен родственным Комментарии. Этот запрос работает:

SELECT cdu_user_progress.game_id, 
      cdu_user_progress.level, 
      max_score, 
      cdu_user_progress.date 
    FROM 
    (
     SELECT game_id, level, MAX(score) AS max_score 
     FROM cdu_user_progress 
     GROUP BY game_id, level 
    ) AS ms 
    JOIN cdu_user_progress ON cdu_user_progress.game_id = ms.game_id AND 
           cdu_user_progress.level = ms.level AND 
           cdu_user_progress.score = ms.max_score 

А что, если я также хочу, чтобы получить счет для ПЕРВОГО game_id (на уровне), и это дата, чтобы получить этот результат:

----------------------------------------------------------------- 
|game_id |level |max_score |max_date |first_score |first_date | 
----------------------------------------------------------------- 
|0  |1  |95  |1391989721 |90   |1391989720 | 
|1  |1  |8   |1391989723 |4   |1391989722 | 
|1  |2  |6   |1391989724 |6   |1391989724 | 
----------------------------------------------------------------- 

Спасибо!

+1

К счастью, этот вопрос задают каждый. Один. день. в SO. Иногда тоже правильно ответили! – Strawberry

+1

Вы задали 15 вопросов. Когда-либо отмечал, что столбец «Связанный» появляется, когда вы пишете свой вопрос? Дубликат также выбирается из столбца «Связанный» справа от вашего вопроса. – fancyPants

ответ

0

Потому что MySQL, вы можете просто сделать это, чтобы вытащить всю строку с наибольшим количеством очков за игру:

select * from (
    select * 
    from cdu_user_progress 
    order by score desc) x 
group by game_id 

Это работает из-за тузд нестандартной группы по функциональности, в результате чего она возвращает первой строка, встречающаяся для каждой группы, если не все столбцы без агрегата называются в разделе group by.

+1

Это определенно не гарантируется. Документация MySQL достаточно ясна, что при использовании расширения по группам, которое позволяет неагрегированным столбцам в выборе, значения берутся из * произвольных * («неопределенных») строк и необязательно из первой строки. Документация находится здесь: http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html. –

+0

@ GordonLinoff все это слышал ... зевать. Покажите мне тестовый пример, который возвращает ничего, кроме первой строки. Вы не можете, потому что это ** никогда не происходит. Этот метод работает 100% или время. Единственный способ, которым это изменится, - это то, что есть главное обновление для mysql, и они решают изменить реализацию этой функции, что маловероятно. Помимо этого, поверьте мне ... вы можете положиться на это поведение. – Bohemian

+1

. , Если в документации явно не указано это, я бы просто - с небольшой болью - проигнорировал проблему (я уверен, что стандарт ANSI говорит, что 'order by' игнорируется в подзапросах, за исключением некоторых конкретные обстоятельства). Поэтому, хотя это работает на практике, я считаю, что это очень плохая практика для обнародования. Хуже, например, чем использовать 'group by' для заказа вещей. Последний явно документирован для работы и будет устаревшим. Первый явно документирован, чтобы не работать. –

 Смежные вопросы

  • Нет связанных вопросов^_^