Ошибка синтаксиса или нарушение прав доступа: 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'])