web-dev-qa-db-ja.com

構文エラーまたはアクセス違反:1055 SELECTリストの式#8がGROUP BY句になく、非集計列が含まれています

cakePHP 3.x "Bookmaker Tutorial"を試してみて、手順を追って説明しました。残念ながら、最初の章の最後に添付のエラーが表示されます。

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

私はすでに自分の問題をグーグルで調べ、「my.cnf」を追加の行で更新する情報を見つけました。私はすでに試してみましたが、何もありませんでした。また、スペルをチェックし、gitbookから「bookmarker-tutorial」をダウンロードしましたが、上記のエラーが表示されます。

MySQL 5.7.11とPHP 5.6.14を使用します。

11
weristsam

これは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以前の動作では、並べ替え順序に応じて最初の1つを選択するだけでしたが、これは予測不可能で失敗する場合がありました。 5.7では、彼らはあなたがそもそもそれをするのを妨げています。

ここでの解決策は、それをグループ化するか、MIN()のような集約演算子をそれに適用することです。

20
tadman

Laravel 5.4を使用しており、同じ問題に直面しています。
config/database.php上のstrictfalseを設定しようとしましたが、動作します。

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

ただし、警告を抑制するよりも、SQLクエリを編集する方が適切です。

13
Fendi Setiawan

これは、MySQL 5.7.11を使用していると述べたように、MySQLの新しいバージョンに関連する問題である可能性があります。したがって、すべてのサイトでこの問題を解決するには、

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

仕事をするだろう

3
Jaya Parwani

同じ問題につまずいただけです。
クエリを変更せずにチュートリアルを「機能させる」簡単な方法は、sql_mode in config/app.php

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

これにより物事が機能するはずですが、実際のケースではおそらく推奨されません。

1
Remka

Tadmanのコメントに加えて、チュートリアルでは、Bookmarks.idだけでなく、Bookmarks.idとBookmarksTags.tag_idの両方でSQL選択クエリを区別する必要があります。

これを行うには、BookmarksTable.phpファイルの次の行

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

のように見えるはずです

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