所以,我更新了我的ubuntu框,并且mysql出现了,为了带来厄运的光荣5.7:
[:error] [pid 9211] [client 0.0.0.0:1] PHP Fatal error:
Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation:
1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains
nonaggregated column 'a.Z'; this is incompatible with sql_mode=only_full_group_by
它指的是:
$s = $d->prepare("SELECT a.Z,a.Y,a.X,MAX(b.F) as `G` FROM `a`,`b` WHERE (a.P=:va1 && b.R:va2)");
拒绝选择列表,HAVING条件或ORDER BY列表引用非聚合列的查询,这些列既不在GROUP BY子句中命名,也不在功能上依赖于(由GROUP BY列唯一确定)。
来源:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
所以,这是我的4个问题:
1-非聚合列为a.Z
,a.Y
,a.X
?
2-功能依赖于=?
3-唯一确定的。文字,列(例如)P_Id int NOT NULL UNIQUE
?
4-即使我在any_value()
a.Z
,a.Y
和a.X
附近添加a.Z
这个错误,我仍然无法解释为什么我这样做。
我想,替代方案是按a.Y
或/和a.X
或/和only_full_group_by
进行分组。但是我在小组中选择了哪3个?为什么?
另外,我不想禁用conf.setJars ( Array ("/fullpath/yourgeneratedjar.jar", "/fullpath/otherdependencies.jar") )
。我想了解如何正确解决当前这个问题,并且很可能是随后的天文数字。
答案 0 :(得分:3)
是。非聚合列是不使用聚合函数的任何列,如MAX
,COUNT
,SUM
,GROUP_CONCAT
等。
如果a
的值意味着特定值b
,则列b
在功能上依赖于列a
。这通常意味着b
是表格的唯一键,而a
是该表格中的其他列。
唯一确定的与功能依赖相同。
另一种方法是列出GROUP BY
列表中的所有非汇总列:GROUP BY a.Z, a.Y, a.X
。
所有这一切的原因是,当您选择不在GROUP BY
列表中的列时,它们将来自分组行中的任意行。这导致许多常见错误。例如,一个常见的错误是写:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
并期望ip_address
包含每个用户的最新登录地址。但它实际上会包含他们登录的地址的任何,而不是MAX(timestamp)
行中的地址。请参阅SQL Select only rows with Max Value on a Column了解正确的方法。
函数依赖性异常通常对连接有用。
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
由于user_id
是users
表的主键,因此它唯一地确定user_name
,因此没有必要在GROUP BY
中明确列出。