2016-03-25 8 views
8

CakePHP 3.x「Bookmaker Tutorial」を試してみました。構文エラーまたはアクセス違反:1055 SELECTリストの式8はGROUP BY句に含まれていません。集約されていない列が含まれています

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」テーブルをチェックするための情報を取得するが、私は前に1レコード生成する必要はありません。残念ながら、最初の章の終わりに、私は付属のエラーを取得します。私はちょっと混乱しました。

Please try correcting the issue for the following table aliases: 

BookmarksTags 

私はすでにGoogleに問題があり、「my.cnf」に余分な行を追加する情報が見つかりました。私はすでに試してみましたが、何も動かなかった。私もスペルをチェックし、githubから "bookmarker-tutorial"をダウンロードしましたが、私はまだ上記のエラーが表示されます。

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

答えて

17

これは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()のような集計演算子を適用することです。

+0

ソート順に関係なく最初のものを取得する方法はありますか? – rotaercz

+0

@rotaerczソートしないと、「最初の」という概念は無意味です。 – tadman

+0

私が意味することは、関係なく行を取得する方法はありますか?私がMySQL 5.7より前に持っていたものをGROUP BYがうまく動作させていました。それはあいまいさに対処しておらず、多くの状況で何が取り出されているかによって問題はありませんでした。 – rotaercz

1

同じ問題が発生しました。クエリを変更せずにチュートリアル「作品」を作るための簡単な方法は、config/app.phpsql_modeをリセットすることができ

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

これは、物事が動作せなければならないが、それはおそらく、実際の生活の例にはお勧めしません。

4

私はLaravel 5.4を使用しており、同じ問題に直面しています。
strictをのfalseに設定しようとしています。

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

ただし、SQLのクエリを編集する方が、警告は表示されません。

0

これは、MySQL 5.7を使用していると言ったように、新しいバージョンのMySQLに関連する問題です。すべてのサイトが保存/etc/mysql/my.cnfファイル&に

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

以下の行を追加するために、コミュニティによって、この

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

答えを見るために11 だから、この問題を解決するためにそれ;そして、サーバーを再起動した後

​​

ではなく、あなたがグループBookmarks.idとBookmarksTags.tag_id両方によってあなたのSQLのSELECTクエリをすべきで、あなたは以下の通りですチュートリアルでは、tadmanさんのコメントに加えて、作業

0

を行うだろうちょうどBookmarks.id

BookmarksTable.phpファイルで、行

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

012のようになります、それを行うために
->distinct(['Bookmarks.id', 'BookmarksTags.tag_id'])