Ошибка синтаксиса или нарушение прав доступа: 1055 Выражение № 8 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец

Я попробовал "Учебник букмекеров CakePHP 3.x", и я последовал инструкциям шаг за шагом. К сожалению, в конце первой главы я получаю прилагаемую ошибку:

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #8 of SELECT list
is not in GROUP BY clause and contains nonaggregated column 'wis.Tags.id' which is not
functionally dependent on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by

Кроме того, я получаю информацию для проверки таблицы "BookmarksTags", но мне больше не нужно создавать ее. Я немного смутился.

Please try correcting the issue for the following table aliases:

BookmarksTags

Я уже google моя проблема, и я нашел информацию для обновления "my.cnf" с дополнительной строкой. Я уже пытаюсь, но ничего не случилось. Я также проверяю орфографию и загружаю "учебник-закладок" из github, но до сих пор вижу эту ошибку выше.

Я использую MySQL 5.7.11 и PHP 5.6.14.

Ответ 1

Это новая вещь в MySQL 5.7 и является предупреждением о том, что ваш запрос неоднозначен.

Рассмотрим следующую таблицу:

id    |   name    |   age    |   points
--------------------------------------------
1         Bob         21         1
2         James       14         1
3         Bob         21         3
4         James       14         2
5         Casey       17         3

Если вы выполнили следующий запрос:

SELECT name, age, SUM(points) FROM scores GROUP BY name

Затем для группировки используется столбец name. Обратите внимание, что age может иметь несколько значений, поэтому оно "не агрегировано". Вам нужно что-то сделать, чтобы свернуть эти значения.

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

Решение здесь состоит в том, чтобы сгруппировать его, или применить к нему агрегированный оператор, например MIN().

Ответ 2

Я использую Laravel 5.4 и сталкиваюсь с той же проблемой.
Я пытаюсь установить strict в false на config/database.php, и он работает.

'connections' => [
    'mysql' => [
        'strict' => false,
    ]
]

Однако лучше отредактировать SQL-запрос, чем подавить его предупреждение.

Ответ 3

Просто наткнулся на ту же проблему.
Простым способом заставить учебник "работать" без изменения запроса может быть reset sql_mode в config/app.php:

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        ...
        'init' => ["SET sql_mode = ''"],
    ],

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

Ответ 4

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

https://craftcms.stackexchange.com/questions/12084/getting-this-sql-error-group-by-incompatible-with-sql-mode-only-full-group-by/13662#13662

ответ сообщества, чтобы добавить строку ниже

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

в файле /etc/mysql/my.cnf и его сохранении; и после перезапуска сервера

sudo service mysql restart

Сделал бы работу

Ответ 5

В дополнение к комментарию tadman, для учебника, который вы читаете, вы должны различать свой запрос выбора sql как с помощью Bookmarks.id, так и BookmarksTags.tag_id, а не просто Bookmarks.id.

Для этого в файле BookmarksTable.php, строка

->distinct(['Bookmarks.id'])

должен выглядеть так

->distinct(['Bookmarks.id', 'BookmarksTags.tag_id'])