MySQL 5.7& only_full_group_by

时间:2016-08-11 23:42:22

标签: php mysql

所以,我更新了我的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.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进行分组。但是我在小组中选择了哪3个?为什么?

另外,我不想禁用conf.setJars ( Array ("/fullpath/yourgeneratedjar.jar", "/fullpath/otherdependencies.jar") ) 。我想了解如何正确解决当前这个问题,并且很可能是随后的天文数字。

1 个答案:

答案 0 :(得分:3)

  1. 是。非聚合列是不使用聚合函数的任何列,如MAXCOUNTSUMGROUP_CONCAT等。

  2. 如果a的值意味着特定值b,则列b在功能上依赖于列a。这通常意味着b是表格的唯一键,而a是该表格中的其他列。

  3. 唯一确定的与功能依赖相同。

  4. 另一种方法是列出GROUP BY列表中的所有非汇总列:GROUP BY a.Z, a.Y, a.X

  5. 所有这一切的原因是,当您选择不在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中明确列出。