mysql 更新SQL模式的GROUP BY查询ONLY_FULL_GROUP_BY

ttp71kqs  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(125)

我的主机从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中,还有departuredeparture 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
感谢您所有的提示,查询修复,解释!

crcmnpdw

crcmnpdw1#

下面是我如何修改每个示例的查询:

示例1:

SELECT headhunter, COUNT(*) AS amount
FROM table
GROUP BY headhunter, amount;

示例二:

SELECT shipid, departure, DATE_FORMAT(departure,'%d.%m.%y') AS departure2
FROM table
WHERE carnumber1=''
GROUP BY shipid, departure, departure2
ORDER BY shipid, departure DESC;

示例3:

No adjustment needed as it's already compliant.

例4:

No adjustment needed; it's already compliant.

例五:

SELECT customer, MAX(preparation) AS max_preparation
FROM table
GROUP BY customer
HAVING max_preparation <= date_sub(NOW(), INTERVAL 6 MONTH)
ORDER BY customer ASC;

例六:

SELECT YEAR(delivery), MONTH(delivery), COUNT(*) AS amount, SUM(purchase_price) AS summed
FROM table
GROUP BY YEAR(delivery), MONTH(delivery);

SELECT子句中的所有列需要做的是要么是GROUP BY子句的一部分,要么使用聚合函数(如NULL、SUM或MAX)。可以利用SELECT子句中声明的别名,也可以在ORDER BY子句中使用SELECT子句中的列。为了使查询与ONLY_FULL_GROUP_BY模式兼容,必须遵循这些准则。

neskvpey

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子句的一部分。

  • 一件重要的事情要记住 *。MySQL支持Functional属性,这意味着如果你在group by子句中使用主键,就不需要添加其他列,因为主键决定了表中的每个属性。

考虑一个简单的例子,它也可以在this fiddle上找到。在下面的示例中,只有第三个查询会失败,因为col2既不是聚合函数的一部分,也不是group by子句的一部分,而且group by中使用的列不是主键

create table test (
  id int primary key,
  col1 int  ,
  col2 text );

insert into test values  (1,3,'Test1'),(2,2,'Test2'),(3,1,'Test3'),(4,1,'Test4');

查询1

SELECT id,sum(col1),col2
FROM test
GROUP BY id;

查询2

SELECT sum(col1),col2
FROM test
GROUP BY id;

查询3

SELECT sum(col1),col2
FROM test
GROUP BY col1;

相关问题