kur*_*ama 1 mysql group-by mysql-error-1055
我的查询有问题,mysql抛出以下错误:
Run Code Online (Sandbox Code Playgroud)#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;
Run Code Online (Sandbox Code Playgroud)
Bil*_*win 13
使用GROUP BY时,只有当每个组具有单个值时,才能在选择列表中使用表达式.否则,您会得到不明确的查询结果.
在您的情况下,MySQL认为s.status每个组可能有多个值.例如,您正在分组,p.products_id但是s.status是另一个表中的列specials,可能与表的一对多关系products.因此,可能有多个行specials具有相同products_id但不同的值status.如果是这种情况,status查询应该使用哪个值?这是模棱两可的.
在您的数据中,您可能会限制行,specials以便每行只有一行products.但MySQL无法做出这样的假设.
MySQL 5.6及更早版本允许您编写这种模糊的查询,相信您知道自己在做什么.但是,默认情况下,MySQL 5.7可以实现更严格的强制执行(这可以降低行为,就像早期版本一样).
修复方法是遵循以下规则:选择列表中的每一列都必须属于以下三种情况之一:
GROUP BY子句中指定的列之一.GROUP BY子句中指定的列.有关更多解释,请阅读此优秀博客:Debunking GROUP BY神话
重新评论,我只能猜测,因为你还没有发布你的表定义.
我猜这个products_description并且manufacturers在功能上依赖于products,所以可以将它们列在select-list中.但这个假设可能不正确,我不知道你的架构.
无论如何,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;
Run Code Online (Sandbox Code Playgroud)
我也以正确的方式重写你的联接.应避免逗号式连接.
| 归档时间: |
|
| 查看次数: |
13266 次 |
| 最近记录: |