我的主机从MySQL 5.7切换到8.0.33很快,所以ONLY_FULL_GROUP_BY是默认启用的。
由于缺少权限,我现在无法将ONLY_FULL_GROUP_BY添加到SQL模式以进行测试。因此,也不可能在主机更新MySQL版本后关闭它。
因此,我现在唯一能做的就是调整查询,以便稍后使用ONLY_FULL_GROUP_BY,如果操作正确,它们现在也应该可以工作。
我是一个懒惰的程序员,一直在做这样的事情:
SELECT *
FROM
table
WHERE
...
GROUP BY xyz
ORDER BY abc
如果在SELECT查询中使用GROUP BY,我就不能再使用 *(=所有列)了,对吗?:-(
示例1:
SELECT headhunter, COUNT(*) AS amount
FROM table
GROUP BY headhunter
我是否需要在GROUP BY中添加amount?
示例二:
SELECT *, departure, DATE_FORMAT(departure,'%d.%m.%y') AS departure2
FROM table
WHERE carnumber1=''
GROUP BY shipid
ORDER BY departure DESC
这里发生了什么我不能在这里用这个词了?
我需要删除 * 并将shipid添加到SELECT中,还有departure(departure 2也是?)改为GROUP BY,shipid改为ORDER BY?
另外,我还必须查看我的PHP代码中,在while循环中的查询之后,我处理了哪些列,并将它们全部添加到SELECT,GROUP BY和ORDER中?!?
示例3:
SELECT customer
FROM table
WHERE carnumber1!=''
GROUP BY customer
ORDER BY customer ASC
这里不需要调整,还是?
例4:
SELECT customer
FROM table
WHERE carnumber1!=''
AND preparation>date_sub(NOW(),INTERVAL 6 MONTH)
GROUP BY customer
ORDER BY customer ASC
也没有调整?
例五:
SELECT customer
FROM table
GROUP BY customer
HAVING MAX(preparation)<=date_sub(NOW(), INTERVAL 6 MONTH)
ORDER BY customer ASC
SELECT、GROUP和ORDER中是否需要列preparation(因为HAVING)?
例六:
SELECT DATE_FORMAT(delivery,'%M %Y'), COUNT(*) AS amount, SUM(purchase_price) AS summed
FROM table
GROUP BY MONTH(delivery), YEAR(delivery)
只是在SELECT中添加delivery,在GROUP BY中添加purchase_price?
感谢您所有的提示,查询修复,解释!
2条答案
按热度按时间crcmnpdw1#
下面是我如何修改每个示例的查询:
示例1:
示例二:
示例3:
例4:
例五:
例六:
SELECT子句中的所有列需要做的是要么是GROUP BY子句的一部分,要么使用聚合函数(如NULL、SUM或MAX)。可以利用SELECT子句中声明的别名,也可以在ORDER BY子句中使用SELECT子句中的列。为了使查询与ONLY_FULL_GROUP_BY模式兼容,必须遵循这些准则。
neskvpey2#
我是一个懒惰的程序员,一直在做这样的事情:
SELECT * FROM table WHERE
求你了别这样在大多数情况下,这是错误的。
请参阅Why is SELECT * considered harmful?了解更多详细信息。
从MySQL Handling of GROUP BY
如果启用了ONLY_FULL_GROUP_BY SQL模式,MySQL将拒绝选择列表、HAVING条件或ORDER BY列表引用的非聚合列,这些列既不在GROUP BY子句中命名,也不在功能上依赖于它们。
简单地说,选择列表中不属于聚合函数(如
MIN(),MAX() etc
)的列应该是group by子句的一部分。考虑一个简单的例子,它也可以在this fiddle上找到。在下面的示例中,只有第三个查询会失败,因为col2既不是聚合函数的一部分,也不是group by子句的一部分,而且group by中使用的列不是主键
查询1
查询2
查询3