Простой MySQL 5.7 only_full_group_by count

Я прочитал http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html

и http://rpbouman.blogspot.nl/2014/09/mysql-575-group-by-respects-functional.html

но все еще получаю ошибки при попытке переписать простой запрос MySQL...

ТАБЛИЦА: Event_Visitors

Event_ID       |     User_ID     |user_level |rsvp_status | updated_time
foreign int(11)| foreign int(11) | int(3)    |  int(3)    | timestamp (onupdate)

Это моя таблица с двумя внешними ключами. Теперь я хочу выполнить следующий запрос:

SELECT min(ev.Event_ID), ev.User_ID, ev.rsvp_status, ev.updated_time, count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID
ORDER BY ev.updated_time DESC

И получаю ошибку:

содержит неагрегированный столбец 'markusp.ev.updated_time', который функционально не зависит

Я знаю, что добавление ev-updated_time в предложение group by решает проблему. Но я хочу подсчитывать строки, а не показывать каждую строку пользователя. (подсчет всех событий, которые посещает пользователь).

Добавление min(ev.Event_ID) или any_value(ev.Event_ID) не решает проблему.

Я не понимаю. Я имею в виду, что время обновления зависит от User_ID + Event_ID, поэтому, если я добавлю User_ID в группу и MIN(Event_ID) должно работать?


person Markus    schedule 10.01.2017    source источник


Ответы (1)


Почему бы просто не написать запрос, который вы хотите? То есть укажите, какие столбцы являются агрегированными, а какие нет, поместив все неагрегированные столбцы в таблицу group by. Один из методов:

SELECT min(ev.Event_ID), ev.User_ID, ev.rsvp_status, ev.updated_time, 
       count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID, ev.rsvp_status, ev.updated_time
ORDER BY ev.updated_time DESC;

Или, возможно, вы имеете в виду это:

SELECT min(ev.Event_ID), ev.User_ID,  count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID
ORDER BY MAX(ev.updated_time) DESC;
person Gordon Linoff    schedule 10.01.2017
comment
Если я помещу все неагрегированные столбцы в group_by, они не будут сгруппированы «только» по User_ID. В вашем запросе выше я получу счет для каждого пользователя, сгруппированного по rsvp и обновленному времени. Я хочу, чтобы все события, которые посещает пользователь, например (различный user_id), и подсчитывали строки. - person Markus; 10.01.2017
comment
P.S. Второй запрос не выполняется из-за MAX(ev.updated_time) в предложении order by. - person Markus; 10.01.2017
comment
@Маркус. . . Второй запрос должен работать именно из-за MAX() в ORDER BY. - person Gordon Linoff; 10.01.2017
comment
Ммм, моему sql не нравится запрос: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «ORDER BY MAX (ev.updated_time) DESC» в строке 4. Однако я знаю, в чем проблема, упорядочение по updated_time, а не в GROUP_BY как ты говорил. Удаление работает. Но это не заказано MAX (updated_time)... - person Markus; 10.01.2017
comment
Ваш запрос сработал как шарм. Есть только ошибка с запятой после предложения GROUP BY. Большое спасибо :) - person Markus; 10.01.2017