的MySQL 5.7&only_full_group_by
所以,我更新了我的Ubuntu箱和mysql一起来到了乘坐的光荣5.7带来约厄运:的MySQL 5.7&only_full_group_by
[: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
。我想了解如何正确地解决这个当前的问题,最有可能的是随后的天文数字。
是的。非聚集的列是不使用聚合功能等
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
。
非常感谢! – hazyred
你必须把所有3放在GROUP BY中。 – Barmar