Я обновил свою систему и установил MySql 5.7.9 с php для веб-приложения, над которым я работаю. У меня есть запрос, который создается динамически, и при запуске в более старых версиях MySql он работает нормально. После обновления до 5.7 я получаю эту ошибку:
Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'support_desk.mod_users_groups.group_id', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by
Обратите внимание на страницу руководства для Mysql 5.7 по теме « Режимы SQL сервера» .
Это вопрос, который доставляет мне проблемы:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Я немного погуглил по этому вопросу, но не понимаю only_full_group_by
достаточно, чтобы понять, что мне нужно сделать, чтобы исправить запрос. Могу ли я просто отключить эту only_full_group_by
опцию, или мне нужно что-то еще сделать?
Дайте мне знать, если вам нужна дополнительная информация.
источник
not a GROUP BY expression
Вот и все. Они могли бы просто иметь числовой код ошибки и вообще никакого сообщения.Ответы:
Я бы просто добавил
group_id
кGROUP BY
.При
SELECT
создании столбца, который не является частьюGROUP BY
этого, в группах может быть несколько значений для этого столбца, но в результатах будет место только для одного значения. Таким образом, базе данных обычно нужно точно сказать, как превратить эти несколько значений в одно значение. Обычно это делается с помощью агрегатной функции, такой какCOUNT()
,SUM()
иMAX()
т. Д. Я обычно говорю, потому что большинство других популярных систем баз данных настаивают на этом. Однако в MySQL до версии 5.7 поведение по умолчанию было более щадящим, потому что он не будет жаловаться и затем произвольно выберет любое значение ! Он также имеетANY_VALUE()
функция, которая может быть использована в качестве другого решения этого вопроса, если вам действительно нужно то же поведение, что и раньше. Такая гибкость обходится дорого, потому что она не является детерминированной, поэтому я бы не рекомендовал ее, если у вас нет веских причин для ее использования. MySQL теперь включаетonly_full_group_by
настройку по умолчанию по уважительным причинам, поэтому лучше привыкнуть к ней и заставить ваши запросы соответствовать ей.Так почему мой простой ответ выше? Я сделал пару предположений:
1)
group_id
уникален Кажется разумным, в конце концов, это «удостоверение личности».2)
group_name
тоже уникален. Это не может быть таким разумным предположением. Если это не так, и у вас есть какой-то дубликат,group_names
и вы затем следуете моему совету для добавленияgroup_id
вGROUP BY
, вы можете обнаружить, что теперь вы получаете больше результатов, чем раньше, потому что группы с одинаковым именем теперь будут иметь отдельные строки в результатах. Для меня это было бы лучше, чем скрывать дублирующиеся группы, потому что база данных незаметно выбрала значение произвольно!Хорошей практикой также является квалификация всех столбцов по имени таблицы или псевдониму, если задействовано более одной таблицы ...
источник
GROUP BY
предложения в моем запросе, но я получаю эту ошибку.Вы можете попытаться отключить
only_full_group_by
настройку, выполнив следующее:MySQL 8 не принимает,
NO_AUTO_CREATE_USER
поэтому необходимо удалить.источник
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
вас есть 20-50 столбцов, хотите ли вы тратить столько времени на добавление каждого столбца в группа по?SELECT @@sql_mode;
и затем добавив результат оттуда в my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
Вы можете отключить предупреждающее сообщение, как описано в других ответах, или вы можете понять, что происходит, и исправить это.
Начиная с MySQL 5.7.5, режим SQL по умолчанию включает ONLY_FULL_GROUP_BY, что означает, что когда вы группируете строки и затем выбираете что-то из этих групп, вам нужно явно указать, из какой строки должен быть сделан этот выбор.
Mysql должен знать, какую строку в группе вы ищете, что дает вам два варианта
group by rect.color, rect.value
который в некоторых случаях может быть тем, что вам нужно, в противном случае вы получите повторяющиеся результаты с тем же цветом, который вам может не понадобитьсяAVG()
MIN()
MAX()
полный списокANY_VALUE()
если вы уверены, что все результаты внутри группы одинаковы. доктористочник
FIRST()
метод / функцию?ONLY_FULL_GROUP_BY
,Если вы не хотите вносить какие-либо изменения в текущий запрос, выполните следующие действия:
sudo vim /etc/mysql/my.cnf
A
чтобы войти в режим вставки.Скопировать и вставить
Тип
esc
для выхода из режима ввода:wq
чтобы сохранить и закрыть Vim.sudo service mysql restart
чтобы перезапустить MySQL.источник
paginate
функции.my.cnf
файла было/etc
. Также обратите внимание на новый синтаксис с тех порMySQL 5.7.8:
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Используйте
ANY_VALUE()
для ссылки на неагрегированный столбец.Из MySQL 5.7 документов :
источник
ANY_VALUE
нигде не упоминал о подобных обсуждениях - у меня отлично работает с моейGROUP_BY
contains nonaggregated column
ошибкой.Я постараюсь объяснить вам, о чем эта ошибка.
Начиная с MySQL 5.7.5, опция
ONLY_FULL_GROUP_BY
включена по умолчанию.Таким образом, согласно стандарту SQL92 и ранее:
( подробнее в документации )
Так, например:
Вы получите сообщение об ошибке после выполнения запроса выше.
Почему?
Потому что MySQL точно не понимает, какие определенные значения из сгруппированных записей нужно извлекать, и в этом суть.
IE скажем, у вас есть эти записи в вашей
users
таблице:И вы выполните неверный запрос, показанный выше.
И вы получите ошибку, показанную выше, потому что есть 3 записи с именем
John
, и это хорошо, но все они имеют разныеemail
значения полей.Итак, MySQL просто не понимает, какие из них возвращать в результирующей сгруппированной записи.
Вы можете решить эту проблему, просто изменив свой запрос следующим образом:
Кроме того, вы можете добавить дополнительные поля в раздел SELECT, но вы не можете сделать это, если они не агрегированы, но есть костыль, который вы можете использовать (но настоятельно не рекомендуется):
Теперь вы можете спросить, почему использование
ANY_VALUE
не рекомендуется?Поскольку MySQL точно не знает, какое значение сгруппированных записей нужно извлечь, и с помощью этой функции вы просите ее извлечь любую из них (в этом случае было получено письмо первой записи с именем = Джон).
Точно не могу придумать какие-либо идеи о том, почему вы хотели бы, чтобы это поведение существовало.
Пожалуйста, если вы меня не понимаете, узнайте больше о том, как работает группировка в MySQL, это очень просто.
И, наконец, вот еще один простой, но правильный запрос.
Если вы хотите запросить общее количество пользователей в соответствии с доступным возрастом, вы можете записать этот запрос
Который полностью действителен, согласно правилам MySQL.
И так далее.
Важно понять, в чем именно проблема, и только потом записать решение.
источник
GROUP BY DAY(created_date)
? Похоже, это не работает, еслиDAY()
добавить.Я использую Laravel 5.3, MySQL 5.7.12, на усадьбе Laravel (я думаю, 0.5.0)
Даже после явной настройки редактирования
/etc/mysql/my.cnf
для отражения:Я все еще получал ошибку.
Мне пришлось изменить
config/database.php
сtrue
наfalse
:Дальнейшее чтение:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
источник
Если вы используете wamp 3.0.6 или более раннюю версию, кроме стабильной версии 2.5, вы можете столкнуться с этой проблемой, во-первых, проблема с sql. Вы должны назвать поля соответственно. но есть другой способ, которым вы можете решить это. нажмите на зеленый значок Wamp. mysql-> mysql settings-> sql_mode-> none. или из консоли вы можете изменить значения по умолчанию.
источник
show variables like '%sql_mode%';
основанная на том, что он сказал, вставьте команду в командной строке mysql, настройка sql_mode будет выставленаДобавление строк (упомянуто ниже) в файле: /etc/mysql/my.cnf
Работай нормально для меня. Версия сервера: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
источник
Перейдите в mysql или phpmyadmin и выберите базу данных, затем просто выполните этот запрос, и он будет работать. Это работает нормально для меня.
источник
Для Mac:
1. Скопируйте файл по умолчанию my-default.cnf в /etc/my.cnf
2. Измените sql_mode в my.cnf, используя ваш любимый редактор, и установите его в этом
3. Перезапустите сервер MySQL.
источник
Вот что помогло мне понять всю проблему:
И в следующем другом примере проблемного запроса.
Проблематично:
Решено, добавив это в конец:
Примечание: смотрите сообщение об ошибке в PHP, оно говорит вам, в чем проблема.
Пример:
В этом случае выражение № 4 отсутствовало в GROUP BY.
источник
Для localhost / wampserver 3 мы можем установить sql-mode = user_mode, чтобы удалить эту ошибку:
затем перезагрузите wamp или apache
источник
Вы можете добавить
unique index
кgroup_id
; если вы уверены, чтоgroup_id
это уникально.Это может решить ваш случай без изменения запроса .
Поздний ответ, но он еще не упоминался в ответах. Возможно, это должно завершить уже исчерпывающие доступные ответы. По крайней мере, это решило мой случай, когда мне пришлось разделить таблицу со слишком большим количеством полей.
источник
Если у вас есть эта ошибка с Symfony, использующим конструктор запросов doctrine , и если эта ошибка вызвана orderBy :
Обратите внимание
select
на столбец, который вы хотитеgroupBy
, и используйтеaddGroupBy
вместоgroupBy
:Работает на Symfony3 -
источник
Извините за то, что не используете ваш точный SQL
Я использовал этот запрос, чтобы преодолеть предупреждение Mysql.
обратите внимание на ключ для меня
источник