Я бы рекомендовал написать этот запрос следующим образом:
SELECT CONCAT(first_name, ' ', last_name) as fullname,
ROUND(AVG(r.correct), 2) as avg_correct,
DATE_FORMAT(MAX(r.time_taken), '%d-%m-%Y') as time_taken
FROM user u LEFT JOIN
test_result r
ON u.user_id = r.user_id
GROUP BY u.user_id, full_name
ORDER BY MAX(r.time_taken) DESC;
Примечания:
FROM
не помогает запросу. Это может помешать оптимизатору. GROUP BY
столбцов из второй таблицы в LEFT JOIN
(если вы действительно не знаете, что делаете). Значение будет NULL
для несоответствий. GROUP BY
. ORDER BY
работал, как вы предполагаете, он должен иметь значение до форматирования , а не после форматирования. Формат %d-%m-%Y
не упорядочен по времени. Вы должны добавить u.fullname
к предложению group by
, и это не повлияет на результаты, поскольку идентификатор пользователя и полное имя уникально сгруппированы вместе, но в случае time_taken
вы должны использовать any_value()
:
SELECT
u.fullname,
ROUND(AVG(r.correct), 2) avg_correct,
date_format(any_value(r.time_taken),'%d-%m-%Y') time_taken
FROM (SELECT user_id, concat( first_name, ' ', last_name) fullname from user) u
LEFT JOIN test_result r ON u.user_id = r.user_id
GROUP BY r.user_id, u.fullname
ORDER BY time_taken DESC
Вы можете найти больше здесь: MySQL Обработка GROUP BY