Как решить Синтаксическая ошибка MySQL или нарушение прав доступа: 1055 Выражение списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец, который функционально не зависит от столбцов в предложении GROUP BY

Пару недель назад работа над устаревшим проектом, который нужно было обновить и перенести на новый сервер, привела меня к следующему исключению в нескольких модулях приложения:

Выражение списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец, это несовместимо с sql_mode = only_full_group_by.

Согласно документации MySQL, наличие единственного полного группового режима в режиме sql будет отклонять запросы, для которых список выбора, условие HAVING или список ORDER BY ссылаются на неагрегированные столбцы, которые не названы в предложении GROUP BY и не являются функционально зависимыми. на (однозначно определяется) столбцов GROUP BY.

В некоторых случаях, так как стандартный запрос не будет работать с конфигурацией по умолчанию в клиенте mysql, вам может потребоваться переписать его так, чтобы исключение больше не появлялось, однако из-за затрат времени и средств. Для разработки вам понадобится более быстрое и не очень дорогое решение. Смысл этого решения заключается в том, что запрос работал в более старой версии MySQL с другими настройками, поэтому вы можете запускать одни и те же запросы, просто изменив режим sql вашего клиента MySQL, и мы покажем вам, как это сделать в этом кратком изложении. статья.

1. Найдите файл MySQL my.cnf

Первое, что вам нужно сделать, это найти файл конфигурации MySQL. Например, для многих дистрибутивов, таких как Plesk, вы можете найти файл на /etc/mysql/my.cnf или в /etc/my.cfn, однако это может отличаться, так что вы сможете найти его с помощью команды linux, например:

find / -name my.cnf

Это выведет путь к файлам с таким именем. Как только вы найдете файл, вы сможете изменить настройку, которая исключит появление исключения.

2. Изменить режим SQL

Внутри [mysqld] установка блока, вам нужно обновить значение sql_mode свойство пустой строки, которая удалит 'only_full_group_by' Режим:

# Inside the mysqld block
[mysqld]
# add new option
sql_mode = ""

Изменить my.cnf файл с использованием nano, vi, emacs или через SFTP и сохраните изменения. Например, my.cnf Файл будет выглядеть так с нашей новой настройкой:

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
bind-address = ::ffff:127.0.0.1
local-infile=0
# Important: remove limitation of group by with the following line
sql_mode = ""

Сохраните изменения в файле и перезапустите mysql с помощью cli в зависимости от вашей ОС и процесса установки, например:

# Ubuntu
sudo service mysql restart
# CentOS
/etc/init.d/mysqld start

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

Ссылка на основную публикацию
Adblock
detector