GROUP BY как способ выбора первой строки из группы похожих строк, это правильно, есть ли альтернатива? - PullRequest
1 голос
/ 05 апреля 2010

У меня есть таблица, в которой хранятся результаты теста:

user | score | time
-----+-------+------
aaa  | 90%   | 10:30
bbb  | 50%   | 9:15   ***
aaa  | 85%   | 10:15
aaa  | 90%   | 11:00  ***
...

Мне нужно, чтобы получить 10 лучших пользователей:

user | score | time
-----+-------+------
aaa  | 90%   | 11:00
bbb  | 50%   | 9:15
...

Я придумал следующее SELECT:

SELECT * FROM (SELECT user, score, time
               FROM tests_score
               ORDER BY user, score DESC, time DESC) t1
GROUP BY user
ORDER BY score DESC, time
LIMIT 10

Работает нормально, но я не совсем уверен, правильно ли я использую ORDER BY для выбора первой строки каждой группы отсортированных записей. Есть ли лучшая практика для достижения того же результата? (Я использую MySQL 5)

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

другое решение, чтобы получить максимальный балл, может быть

SELECT t1.* 
  FROM tests_score t1
  JOIN (SELECT user, MAX(score)  
          FROM test_score  
      GROUP BY user) as t2 ON t1.user = t2.user  
                          AND t1.score = t2.score
1 голос
/ 05 апреля 2010

Похоже, вы хотите, чтобы счет был в самое последнее время.

Этот запрос получает самую последнюю оценку для каждого пользователя и упорядочивает их по количеству.

SELECT user, MAX(score), time
FROM test_results tr
LEFT OUTER JOIN test_results tr2
ON tr2.user = tr.user AND tr2.time > tr.time
WHERE tr2.user IS NULL
GROUP BY user
ORDER BY MAX(score) DESC, time

Если для одного и того же пользователя публикуются две оценки за одно и то же время, используется более крупная. Это работает только в том случае, если счет представляет собой целочисленный столбец, а не строковый столбец, поскольку 5% предшествует 60% в алфавитном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...