Как получить тот же результат без отключения ONLY_FULL_GROUP_BY - PullRequest
1 голос
/ 14 апреля 2019

Следующий запрос выполняется после отключения ONLY_FULL_GROUP_BY в MySQL.Теперь я хочу получить тот же результат без отключения режима ONLY_FULL_GROUP_BY, например GROUP BY r.user_id, u.fullname, r.time_taken

SELECT u.fullname, ROUND(AVG(r.correct), 2) avg_correct, date_format(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
ORDER BY r.time_taken DESC

Снимок экрана: screenshot

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

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

SELECT CONCAT(u.first_name, ' ', u.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, fullname
ORDER BY MAX(r.time_taken) DESC;

Примечания:

  • Подзапрос в предложении FROM не помогает запросу.Это может помешать оптимизатору.
  • Не GROUP BY столбцы из таблицы second в LEFT JOIN (если вы действительно не знаете, что делаете).Значение будет NULL для несоответствий.
  • MySQL и MariaDB разрешают псевдонимы столбцов в предложении GROUP BY.
  • Чтобы ORDER BY работал так, как вы предполагали, ему нужнонаходиться на значении до форматирования, а не после форматирования.Формат %d-%m-%Y не упорядочен по времени.
1 голос
/ 14 апреля 2019

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

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