Список SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец.... несовместим с sql_mode = only_full_group_by

AM с использованием MySQL 5.7.13 на моем ПК с Windows WAMP Server

Здесь моя проблема. Выполняя этот запрос

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

Получается всегда ошибка, подобная этой

Выражение №1 в списке SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец "returntr_prod.tbl_customer_pod_uploads.id", который не зависит от функциональности в столбцах в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

Не могли бы вы рассказать мне лучшее решение...

Мне нужно Result like

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

Ответ 1

Это

Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'returntr_prod.tbl_customer_pod_uploads.id', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

будет просто решена путем изменения режима sql в MySQL с помощью этой команды,

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

Это тоже работает для меня.. Я использовал это, потому что в моем проекте есть много подобных запросов, поэтому я просто изменил этот режим sql на only_full_group_by

Благодарю вас... :-)

Ответ 2

Когда only_full_group_by режим MySQL only_full_group_by, это означает, что при использовании GROUP BY будут применяться строгие правила ANSI SQL. Что касается вашего запроса, это означает, что если вы proof_type GROUP BY столбца proof_type, то вы можете выбрать только две вещи:

  • столбец proof_type или
  • агрегаты любого другого столбца


Под "агрегатами" других столбцов я подразумеваю использование агрегатной функции, такой как MIN(), MAX() или AVG() с другим столбцом. Так что в вашем случае следующий запрос будет действительным:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

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

Примечание: ANSI SQL расширяет то, что разрешено выбирать в GROUP BY, также включая столбцы, которые функционально зависят от выбранных столбцов. Примером функциональной зависимости может быть группировка по столбцу первичного ключа в таблице. Поскольку первичный ключ гарантированно будет уникальным для каждой записи, поэтому будет также определено значение любого другого столбца. MySQL - одна из баз данных, которая позволяет это (SQL Server и Oracle не AFAIK).

Ответ 3

Вы можете отключить sql_mode = only_full_group_by по какой-либо команде вы можете попробовать это с помощью терминала или MySql IDE

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';

Ответ 4

Используйте любое решение

(1) PHPMyAdmin

если вы используете phpMyAdmin, измените настройку " sql_mode ", как указано на скриншоте ниже. enter image description here

Отредактируйте переменную "sql mode" и удалите текст "ONLY_FULL_GROUP_BY" из значения

(2) Командная строка Запустите приведенную ниже команду.

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

(3) Не используйте SELECT *

Используйте соответствующий столбец в запросе SELECT. соответствующие столбцы средств, которые либо входят в предложение "group by", либо столбец с агрегатной функцией (MAX, MIN, SUM, COUNT и т.д.)


Важная заметка

Изменения, сделанные с помощью пункта (1) ИЛИ (2), не установят его ПОСТОЯННО, и он будет возвращаться после каждого перезапуска.

Поэтому вы должны установить это в своем конфигурационном файле (например,/etc/mysql/my.cnf в разделе [mysqld]), чтобы изменения оставались в силе после перезапуска MySQL:

Файл конфигурации : /etc/mysql/my.cnf

Имя переменной: sql_mode ИЛИ sql-mode

Ответ 5

Чтобы запрос был допустимым в SQL92, столбец имени должен быть пропущен в списке выбора или иметь имя в предложении GROUP BY.

SQL99 и более поздние версии разрешают такие неагрегаты для каждой необязательной функции T301, если они функционально зависят от столбцов GROUP BY: если такая связь существует между name и custid, запрос является допустимым. Это было бы так, например, были бы первыми ключами клиентов.

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

через MySQL :: MySQL 5.7 Справочное руководство :: 12.19.3 MySQL Обработка GROUP BY

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

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

и... не забудьте переподключить базу данных !!!

Ответ 6

Ниже метод решил мою проблему:

В Ubuntu

Тип: sudo vi /etc/mysql/my.cnf

введите A для входа в режим вставки

В последней строке вставьте код из двух строк:

[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

Введите esc, чтобы выйти из режима ввода

Type :wq to save and close vim.

Введите sudo service mysql restart, чтобы перезапустить MySQL.

Ответ 7

Из того, как это выглядит, я думаю, что группировка по нескольким столбцам/полям не повредит ваш результат. Почему бы вам не попробовать добавить в группу:

GROUP BY `proof_type`, `id`

Сначала будет группироваться proof_type, затем id. Надеюсь, это не изменит результаты. В некоторых/большинстве случаев группа из нескольких столбцов дает неверные результаты.

Ответ 8

Ответ от Dhanu K и Anil Gupta работал на меня, однако вам нужно перезапустить mysql в терминале, чтобы увидеть результат.

Ответ 9

  1. Войдите в phpMyAdmin
  2. Перейдите к: Сервер: localhost: 3306 и не выбирайте базы данных.
  3. Нажмите на переменные в верхнем меню
  4. Найдите "sql mode" и измените соответствующее значение на: NO_ENGINE_SUBSTITUTION

Все это.

Я сделал это в своем Ec2, и это сработало как шарм.

Ответ 10

Откройте панель WAMP и откройте файл конфигурации MySQL. В нем ищите "sql_mode", если вы найдете его, установите "", иначе, если вы не найдете его, добавьте sql_mode = "" в файл.

Перезапустите сервер MySQL, и все готово...

Удачного кодирования.

Ответ 11

В вашем my.ini напишите это:

[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"

зависит от вашей версии. Или же:

[mysqld]
sql_mode = ""

или просто удалите это: ONLY_FULL_GROUP_BY