Рабочий запрос не работает в MySQL 5.7 this is incompatible with sql_mode=only_full_group_by

538
13 мая 2017, 21:57

При выполнении запроса из под php, появляется следующая ошибка:
SELECT list is not in GROUP BY clause and contains nonaggregated column 'rusintech.pt.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by Array
Сам запрос следующий:

UPDATE product_tara_test AS p 
INNER JOIN (
      SELECT id FROM product_tara_test pt 
      WHERE price IS NOT NULL AND price > 0 AND id_stockroom = ? 
      GROUP BY id_product) as B
ON p.id = B.id
      SET
      p.tara = '',
      p.meter = '',
      p.id_city = NULL,
      p.type_unit = '',
      p.weight_b = '',
      p.weight_n = '',
      p.comment = '',
      p.reserve = '',
      p.year_kpp = '',
      p.provide = '',
      p.sutured = '',
      p.characteristics = '',
      p.date_export = '',
      p.price_nds = NULL,
      p.active = 1


Почему то запрос не работает из под php, если я через редактор MySQL выполняю запрос, запрос проходит без ошибок. На локальном компьютере запрос так же работает успешно. Но на сервере появляется ошибка и именно если он выполняется через php

На сервере версии:
PHP 7.1.4
MySQL 5.7.18-ndb-7.6.2

На локальной машине:
PHP 7.0.7
5.7.13-log

Answer 1

Методы исправления проблемы:

  1. Выяснить, одному значению product_tara_test.id_product соответствует строго одно значение product_tara_test.id или несколько (не по факту, а на уровне структуры таблицы и подсистемы целостности данных). Если одному - из SELECT-a убрать GROUP BY и добавить DISTINCT. Если НЕ одному - обернуть id в групповую функцию (например, MIN(id)). Наилучшее решение.

  2. Установить на уровне сессии (вообще или только для этого запроса) значение ONLY_FULL_GROUP_BY в состояние OFF. Решение очень среднего качества.

Установить в OFF:

SET SESSION sql_mode = REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', '');

Установить в ON:

SET SESSION sql_mode = CASE FIND_IN_SET('ONLY_FULL_GROUP_BY',@@SESSION.sql_mode)
                       WHEN 0 THEN CONCAT('ONLY_FULL_GROUP_BY,',@@SESSION.sql_mode)
                       ELSE @@SESSION.sql_mode
                       END;
  1. Добавить в выражение группировки поле product_tara_test.id. Худшее решение, может повлиять на логику (и соответственно на результат) запроса.
READ ALSO
apache отдает php как текст

apache отдает php как текст

Скопировал сайт с хостинга на локальный сервер openServer и столкнулся с проблемой, что сервер при ajax запросе к файлу, отдает его текст как естьТ

408
Проблема с запросами PDO SQLITE

Проблема с запросами PDO SQLITE

Не могу найти решения в гугле, помогите разобраться пожалуйста:

284
права на скрипт в ubuntu из php

права на скрипт в ubuntu из php

есть скрипт /usr/local/vesta/bin/v-add-user из под sudo работаетего права

285