的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.Za.Ya.X

2-功能上依赖于=?

3-唯一确定的。文学上,列(例如)P_Id int NOT NULL UNIQUE

4-虽然这个错误,我可以添加any_value()各地a.Za.Ya.X我还是不明白,为什么我这样做修复。 我想,替代方案将由a.Z或/和a.Y或/和a.X做一个组。但是,我会在哪个组中选择哪个,为什么?我不想禁用only_full_group_by。我想了解如何正确地解决这个当前的问题,最有可能的是随后的天文数字。

+0

你必须把所有3放在GROUP BY中。 – Barmar

  1. 是的。非聚集的列是不使用聚合功能等MAX任何列,COUNTSUMGROUP_CONCAT

  2. a函数依赖于b柱如果b值意味着a特定值。这通常意味着b是该表的唯一键,a是该表中的某个其他列。

  3. 由函数依赖关系唯一确定。

  4. 另一种方法是列出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_idusers表的主键,它惟一确定user_name,所以没有必要列出明确GROUP BY

+0

非常感谢! – hazyred