Список 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
- Войдите в phpMyAdmin
- Перейдите к: Сервер: localhost: 3306 и не выбирайте базы данных.
- Нажмите на переменные в верхнем меню
- Найдите "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