MySQL: выбор ALL с GROUP BY не работает [дубликат]

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

Например:

var result = 1.0 + 2.0;     // result === 3.0 returns true

... вместо:

var result = 0.1 + 0.2;     // result === 0.3 returns false

Выражение 0.1 + 0.2 === 0.3 возвращает false в JavaScript, но, к счастью, целочисленная арифметика в плавающей запятой является точной, поэтому ошибки с десятичным представлением можно избежать путем масштабирования.

В качестве практического примера, чтобы избежать проблем с плавающей запятой, где точность имеет первостепенное значение, рекомендуется обрабатывать деньги как целое число, представляющее число центов: 2550 центов вместо 25.50 долларов.


1 Дуглас Крокфорд: JavaScript: Хорошие детали: Приложение A - Ужасные части (стр. 105) .

349
задан fedorqui 11 March 2016 в 22:18
поделиться

18 ответов

Решение 1: удалить ONLY_FULL_GROUP_BY из консоли mysql

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

, вы можете прочитать здесь здесь

Решение 2: Удалить ONLY_FULL_GROUP_BY из phpmyadmin

  • Открыть phpmyadmin & amp; выберите localhost
  • Нажмите меню Переменные & amp; прокрутите вниз для режима sql
  • Нажмите кнопку редактирования, чтобы изменить значения & amp; удалите ONLY_FULL_GROUP_BY & amp; нажмите «Сохранить».
688
ответ дан Eyo Okon Eyo 26 August 2018 в 17:22
поделиться

В MySQL 5.7 и Ubuntu 16.04 отредактируйте файл mysql.cnf.

$ sudo nano /etc/mysql/conf.d/mysql.cnf

Включите sql_mode следующим образом и сохраните файл.

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Обратите внимание, что , в моем случае я удалил режим STRICT_TRANS_TABLES и ONLY_FULL_GROUP_BY.

Сделав это, он сохранит конфигурацию режима навсегда. Иначе, если вы просто обновите @@ sql_mode через MySQL, потому что он перезагрузится при перезагрузке машины / службы.

После этого, чтобы модифицированная конфигурация приняла действие, перезапустите службу mysql:

$ sudo service mysql restart

Попробуйте получить доступ к mysql:

$ mysql -u user_name -p

Если вы можете войти в систему и получить доступ к консоли MySQL, это нормально. Отлично!

НО, если мне нравится, вы сталкиваетесь с ошибкой «неизвестной переменной sql_mode», которая указывает, что sql_mode является опцией для mysqld, вам нужно будет вернуться, отредактировать файл mysql.cnf снова и измените значение [mysql] на [mysqld]. Перезапустите службу MySQL и выполните последний тест, пытающийся войти в консоль MySQL. Вот оно!

8
ответ дан Alexandre Ribeiro 26 August 2018 в 17:22
поделиться

Благодаря @cwhisperer. У меня была такая же проблема с Doctrine в приложении Symfony. Я просто добавил параметр в свой config.yml:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

Это сработало для меня.

36
ответ дан Arvid 26 August 2018 в 17:22
поделиться

Попробуйте:

SET sql_mode = ''

Сообщество Примечание. Как указано в ответах ниже, это фактически очищает все поддерживаемые в настоящее время режимы SQL. Возможно, это не обязательно то, что вы хотите.

92
ответ дан Bhargav Rao 26 August 2018 в 17:22
поделиться

Обновление:

Чтобы сохранить текущие настройки mysql и отключить ONLY_FULL_GROUP_BY, я предлагаю посетить ваш phpmyadmin или любой другой клиент, который вы используете, и type:

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

следующий результат копирования в ваш файл my.ini.

mint: sudo nano /etc/mysql/my.cnf

ubuntu 16 и вверх: sudo nano /etc/mysql/my.cnf

ubuntu 14-16: /etc/mysql/mysql.conf.d/mysqld.cnf

Внимание! Результат copy_me может содержать длинный текст, который по умолчанию может быть обрезан. Убедитесь, что вы скопировали весь текст!


старый ответ:

Если вы хотите окончательно отключить ошибку " Выражение #N списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец «db.table.COL», который функционально не зависит от столбцов в предложении GROUP BY, это несовместимо с sql_mode = only_full_group_by »выполняет следующие шаги:

  1. sudo nano /etc/mysql/my.cnf
  2. Добавьте это в конец файла
    [mysqld]  
    sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    
  3. sudo service mysql restart, чтобы перезагрузить MySQL

Это отключит ONLY_FULL_GROUP_BY для ВСЕХ пользователей

290
ответ дан breq 26 August 2018 в 17:22
поделиться
    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> exit;
85
ответ дан brwngrldev 26 August 2018 в 17:22
поделиться

Документация MySQL также определяет следующие методы:

  • Установите sql-mode="<modes>" в файле параметров, таком как my.cnf (операционные системы Unix) или my. ini (Windows).
  • Чтобы установить режим SQL при запуске сервера через командную строку, используйте параметр --sql-mode="<modes>".

* Где <modes> является Список различных режимов, разделенных запятыми.

Чтобы очистить режим SQL явно, установите его в пустую строку, используя --sql-mode="" в командной строке или sql-mode="" в файле параметров.

Я добавил параметр sql-mode="" в /etc/my.cnf, и он сработал.

Это SO-решение обсуждает способы выяснить, какой файл my.cnf используется MySQL .

Не забудьте перезапустить MySQL после внесения изменений.

22
ответ дан Community 26 August 2018 в 17:22
поделиться

Я использую доктрину, и я добавил driverOptions в свой doctrine.local.php:

return array(
'doctrine' => array(
    'connection' => array(
        'orm_default' => array(
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => array(
                'host' => 'localhost',
                'port' => '3306',
                'user' => 'myusr',
                'password' => 'mypwd',
                'dbname' => 'mydb',
                'driverOptions' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                ),
            ),
        ),
    ),
));

В phpmyadmin пользователю нужно SUPER активироваться в привилегиях.

5
ответ дан cwhisperer 26 August 2018 в 17:22
поделиться

Это постоянное решение для MySql 5.7+ на Ubuntu 14 +:

$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name

Если вы можете войти в систему без ошибок - вы должны быть настроены сейчас.

1
ответ дан demisx 26 August 2018 в 17:22
поделиться

Вы можете отключить его с помощью конфигурационного файла my.cnf:

$ mysql --verbose --help | grep my.cnf

Итак, в macOS 10.12 он находится в usr/local/etc/my.cnf. Вы можете отредактировать sql_mode здесь:

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
0
ответ дан Dio Phung 26 August 2018 в 17:22
поделиться

Если вы используете MySQL 8.0.11, удалите 'NO_AUTO_CREATE_USER' из sql-mode.

Добавьте следующую строку в файл /etc/mysql/my.cnf и [mysqld] header

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
2
ответ дан Hiren Bhut 26 August 2018 в 17:22
поделиться

On:

  • Ubuntu 14.04
  • mysql Ver 14.14 Распространение 5.7.16 для Linux (x86_64) с использованием обложек EditLine

Do:

$ sudo nano /etc/mysql/conf.d/mysql.cnf

Скопировать и вставить:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

В нижней части файла

$ sudo service mysql restart
22
ответ дан Jadeye 26 August 2018 в 17:22
поделиться

Добавление только одного режима в sql_mode без удаления существующих:

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

Удаление только определенного режима из sql_mode без удаления других:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

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

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Ссылка: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

44
ответ дан Janaka R Rajapaksha 26 August 2018 в 17:22
поделиться

Будьте осторожны с использованием

SET sql_mode = '' 

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

SELECT @@sql_mode 

, чтобы получить список разрешенных разделов с запятыми, затем установите его в этот список без ONLY_FULL_GROUP_BY.

171
ответ дан Machavity 26 August 2018 в 17:22
поделиться

Вот мое решение, изменяющее конфигурацию Mysql через панель управления phpmyadmin:

Чтобы исправить «это несовместимо с sql_mode = only_full_group_by»: откройте домашнюю страницу phpmyadmin и goo и выберите подменю «Переменные». Прокрутите вниз, чтобы найти режим sql. Измените режим sql и удалите 'ONLY_FULL_GROUP_BY' Сохраните его.

0
ответ дан Marcello Perri 26 August 2018 в 17:22
поделиться

На моем sql (версия 5.7.11 работает на Mac OS X) эта работа для меня на mysql shell client:

SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Согласно документации MySQL 5.6, sql_mode по умолчанию -

пустая строка в MySQL 5.6.5 и обратно NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES в 5.6.6 +

mysql 5.6 reference

9
ответ дан Salvatore Napoli 26 August 2018 в 17:22
поделиться

Если вы используете WAMP. Щелкните левой кнопкой мыши по значку WAMP, затем перейдите в MySQL -> Настройки MySQL -> sql-mode, а затем выберите режим sql-mode-> user

17
ответ дан tinlyx 26 August 2018 в 17:22
поделиться

Я заметил, что решение @Eyo Okon Eyo работает до тех пор, пока сервер MySQL не перезагружается, а настройки по умолчанию восстанавливаются. Вот постоянное решение, которое сработало для меня:

Чтобы удалить определенный режим SQL (в этом случае ONLY_FULL_GROUP_BY), найдите текущий режим SQL:

SELECT @@GLOBAL.sql_mode;

скопируйте результат и удалите от него то, что вам не нужно (ONLY_FULL_GROUP_BY)

например:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

to

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

создать и открыть этот файл:

/etc/mysql/conf.d/disable_strict_mode.cnf

и записать в него новый режим SQL:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

перезапустить MySQL:

sudo service mysql restart

Или вы можете использовать ANY_VALUE() для подавления ONLY_FULL_GROUP_BY, вы можете узнать больше об этом здесь

13
ответ дан Waqleh 26 August 2018 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: