gpt4 book ai didi

MySQL 错误 : SELECT list is not in GROUP BY clause

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

我的查询有问题,mysql 抛出以下错误:

#1055 - Expression #66 of SELECT list is not in GROUP BY clause and 
contains nonaggregated column 's.status' which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by

查询是:

select   p.*,
pd.*,
m.*,
IF(s.status, s.specials_new_products_price, null) as specials_new_products_price,
IF(s.status, s.specials_new_products_price, p.products_price) as final_price
FROM products p
LEFT JOIN specials s ON p.products_id = s.products_id
LEFT JOIN manufacturers m using(manufacturers_id) ,
products_description pd,
categories c,
products_to_categories p2c
WHERE p.products_view = 1
AND p.products_status = 1
AND p.products_archive = 0
AND c.virtual_categories = 0
AND p.products_id = pd.products_id
AND p.products_id = p2c.products_id
AND p2c.categories_id = c.categories_id
AND pd.language_id = 1

GROUP BY p.products_id;

最佳答案

当您使用 GROUP BY 时,您可以在选择列表中使用表达式,前提是它们每组只有一个值。否则你会得到不明确的查询结果。

在您的情况下,MySQL 认为 s.status 每组可能有多个值。例如,您按 p.products_id 进行分组,但 s.status 是另一个表 specials 中的一列,可能是一对一的- 与表 products 的许多关系。因此,specials 中可能有多行具有相同的 products_id,但 status 的值不同。如果是这种情况,查询应该使用 status 的哪个值?这是模棱两可的。

在您的数据中,您可能碰巧限制了行,这样对于 products 中的每一行,您在 specials 中只有一行。但是 MySQL 不能做出这样的假设。

MySQL 5.6 及更早版本允许您编写此类模棱两可的查询,相信您知道自己在做什么。但是 MySQL 5.7 默认启用更严格的执行(这可以像早期版本一样不那么严格)。

解决方法是遵循以下规则:选择列表中的每一列都必须属于以下三种情况之一:

  • 该列位于聚合函数内,例如 COUNT()、SUM()、MIN、MAX()、AVERAGE() 或 GROUP_CONCAT()。
  • 该列是 GROUP BY 子句中指定的列之一。
  • 该列在功能上依赖于 GROUP BY 子句中指定的列。

有关更多解释,请阅读这个优秀的博客:Debunking GROUP BY myths


关于你的评论,我只能猜测,因为你还没有发布你的表定义。

我猜测 products_descriptionmanufacturers 在功能上依赖于 products,因此可以在选择中按原样列出它们 -列表。但是这个假设可能不正确,我不知道你的架构。

无论如何,关于s.status 的错误应该通过使用聚合函数来解决。我以 MAX() 为例。

SELECT p.*,
pd.*,
m.*,
MAX(IF(s.status, s.specials_new_products_price, NULL))
AS specials_new_products_price,
MAX(IF(s.status, s.specials_new_products_price, p.products_price))
AS final_price
FROM products p
LEFT OUTER JOIN specials s ON p.products_id = s.products_id
INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
INNER JOIN products_description pd ON p.products_id = pd.products_id
INNER JOIN products_to_categories p2c ON p.products_id = p2c.products_id
INNER JOIN categories c ON p2c.categories_id = c.categories_id
WHERE p.products_view = 1
AND p.products_status = 1
AND p.products_archive = 0
AND c.virtual_categories = 0
AND pd.language_id = 1
GROUP BY p.products_id;

我还以正确的方式重写了您的连接。应避免逗号式连接。

关于MySQL 错误 : SELECT list is not in GROUP BY clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38705315/

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