Как получить тот же результат без отключения ONLY_FULL_GROUP_BY

1
задан w3outlook 14 April 2019 в 10:52
поделиться

2 ответа

Я бы рекомендовал написать этот запрос следующим образом:

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 для несоответствий.
  • MySQL и MariaDB разрешают псевдонимы столбцов в предложении GROUP BY.
  • Для того, чтобы ORDER BY работал, как вы предполагаете, он должен иметь значение до форматирования , а не после форматирования. Формат %d-%m-%Y не упорядочен по времени.
0
ответ дан Gordon Linoff 14 April 2019 в 10:52
поделиться

Вы должны добавить 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

0
ответ дан forpas 14 April 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: