2016-07-22 1 views
0

Так что я просто обновлен до последней MySQL, и я получаю эту ошибку:После обновления MySQL, получение странно РЕГИСТРИРУЙТЕСЬ ошибки из 'sql_mode = only_full_group_by'

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'stats.playtime.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Мой стол:

id int(255) 
date datetime 

Мой запрос:

SELECT DATE(date) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GROUP BY DATE(date) 

Все это делает скажите мне, сколько пользователей первым присоединился на определенную дату, что позволяет мне отображение этих данных на графике.

Я точно не знаю, в чем проблема с этим вопросом? Я понимаю, что в этой новой версии MySQL должны быть новые правила синтаксиса, но я не уверен, как их следовать с этим запросом. Есть идеи?

Второй пример вызывает тот же вопрос:

Таблица:

id     int(11) 
user    varchar(255) 
course    varchar(255) 
course_difficulty varchar(255) 
time_taken   int(255) 

Запрос:

SELECT course, course_difficulty, time_taken 
FROM minigame 
WHERE user = 'abc' 
GROUP BY course 
ORDER BY time_taken LIMIT 50 
+0

@FirstOne Я могу запустить этот тип запроса, без необходимости делать это как на мой тест и живых серверов (игнорируя вопрос отдельный упомянутый выше). Это используется по другим причинам? Или просто для синтаксиса, чтобы разрешить выполнение запроса? – user3420034

+2

'date' не является зарезервированным словом, звездная идея, [возможно, нет] (http://i.imgur.com/oUwa6hG.jpg) – Drew

+0

' DESC' в 'group by' clause? Вы уверены, что хотите использовать 'grup by', а не' order by'? – zajonc

ответ

3

В первом примере оптимизатор MySQL недостаточно умен, чтобы распознать выражение DATE(date) + INTERVAL 1 DAY функционально зависит от DATE(date). Обходным путем для этого является включение всего выражения в предложение GROUP BY.

Во втором примере MySQL захватывает неагрегаты в списке SELECT, которые еще не включены в предложение GROUP BY, потому что они не зависят от функциональности.

Вот некоторые данные примера таблицы, демонстрирующие обоснование ошибки:

id user course 
-- ---- ------ 
11 fee win101 
12 fi  win101 
13 fo  win101 

Когда мы пытаемся запустить этот запрос:

SELECT t.course, t.user 
    FROM mytable t 
GROUP BY t.course 

Есть три возможного значения, которые могут быть возвращены для user ... гонорар, fi или fo.

MySQL разрешит выполнение запроса, если вместо столбца будет использоваться агрегированное выражение. В этом примере мы могли бы использовать MIN (t.user) или MAX (t.user), и MySQL вернет «гонорар» или «fo», соответственно.

MySQL будет выполнить этот запрос:

SELECT t.course 
    , MIN(t.user) AS min_user 
    , MAX(t.user) AS max_user 
    , COUNT(1) 
    FROM mytable t 
GROUP BY t.course 
1

COUNT(DISTINCT id) является функцией агрегации, так что это разрешено быть в избранной статье с group by. Но DATE(date) + INTERVAL 1 DAY не является функцией агрегации и не отображается в group by cluase, поэтому это является причиной вашей ошибки.

Чтобы решить эту проблему, вы должны добавить свой не агрегированный столбец в group by статье, как в запросе

SELECT DATE(`date`) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GRUP BY DATE(`date`) + INTERVAL 1 DAY 

Более подробную информацию о group by и функции агрегации вы можете найти [здесь]. 1

+0

Спасибо за информацию! Я просто добавил второй запрос, вызывающий проблемы, в которых я не использую никаких операций в SELECT или GROUP BY. Есть идеи по этому поводу? – user3420034

+0

Но объяснение одно и то же: ваши столбцы 'course_difficulty' и' time_taken' должны появляться в разделе 'grup by' или вам нужно использовать их с функцией агрегации, например' max', 'sum' и т. Д. – zajonc

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

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