gpt4 book ai didi

php - MySQL 5.7 & only_full_group_by

转载 作者:行者123 更新时间:2023-11-29 05:11:22 24 4
gpt4 key购买 nike

所以,我更新了我的 ubuntu box,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- 尽管我可以通过在 a.Za.Ya.X 周围添加 any_value() 来修复这个错误> 我仍然不明白我为什么要这样做。我想另一种方法是按 a.Z 或/和 a.Y 或/和 a.X 进行分组。但是我在组中选择这 3 个中的哪一个,为什么?

此外,我不想禁用 only_full_group_by。我想了解如何正确解决当前的问题,很可能会出现天文数字。

最佳答案

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

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

  3. Uniquely determined by is same as functional dependency.

  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 中明确列出。

关于php - MySQL 5.7 & only_full_group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38907729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com