语法错误或访问冲突:1055 SELECT列表的表达式#8不在GROUP BY子句中,并且包含非聚合列

时间:2016-03-25 22:08:57

标签: mysql apache cakephp

我尝试了CakePHP 3.x" Bookmaker教程"我一步一步地按照说明进行操作。不幸的是,在第一章的最后我得到了附加的错误:

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"额外的一条线。我已经尝试但没有发生任何事情。我还检查了拼写并下载了#34; bookmarker-tutorial"从github但我仍然得到上面的错误。

我使用MySQL 5.7.11和PHP 5.6.14。

5 个答案:

答案 0 :(得分:20)

这是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()等聚合运算符应用于此。

答案 1 :(得分:13)

我使用Laravel 5.4并遇到同样的问题 我尝试在strict上将false设置为config/database.php,然后就可以了。

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

然而,编辑sql查询比抑制它的警告更好。

答案 2 :(得分:2)

这可能是与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

社区的答案添加以下行

String

/etc/mysql/my.cnf文件&拯救它;并在重新启动服务器后

[function1]

会做的工作

答案 3 :(得分:1)

偶然发现了同样的问题 在不更改查询的情况下使教程“正常”的简单方法可能是重置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 :(得分:1)

除了tadman的评论之外,对于您所关注的教程,您应该通过Bookmarks.id和BookmarksTags.tag_id来区分您的sql select查询,而不仅仅是Bookmarks.id

为此,在BookmarksTable.php文件中,行

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

应该看起来像

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