Mysql 分组函数的使用无效,但没有分组依据
我正在尝试运行此查询:Mysql 分组函数的使用无效,但没有分组依据,mysql,group-by,Mysql,Group By,我正在尝试运行此查询: UPDATE `ps_category_lang` cl LEFT JOIN ps_product_shop p ON cl.id_category=p.id_category_default AND cl.id_shop=p.id_shop AND p.available_for_order =1 AND p.visibility != 'none' LEFT JOIN ps_specific_price sp
UPDATE `ps_category_lang` cl
LEFT JOIN ps_product_shop p
ON cl.id_category=p.id_category_default
AND cl.id_shop=p.id_shop
AND p.available_for_order =1
AND p.visibility != 'none'
LEFT JOIN ps_specific_price sp
ON p.id_product=sp.id_product
AND ((sp.`from` = '0000-00-00 00:00:00' OR NOW() >= sp.`from`)
AND (sp.`to` = '0000-00-00 00:00:00' OR NOW() <= sp.`to`))
AND (sp.id_shop=0 OR sp.id_shop=p.id_shop)
SET cl.meta_title=CONCAT(
SUBSTRING_INDEX(
TRIM(cl.`meta_title`),
'från',
1
),
'från ',
FORMAT(
ROUND(
min(p.price-IF(sp.reduction>0,sp.reduction, 0)
) *
(SELECT conversion_rate
FROM ps_currency
WHERE iso_code='SEK'
AND deleted=0
)
),
0,
'sv_SE'),
' kr.',
SUBSTRING_INDEX(cl.`meta_title`, ' kr.', -1)
)
WHERE cl.`id_lang` = 7
AND cl.meta_title LIKE '% från%'
AND cl.meta_title LIKE '% kr.%'
AND p.available_for_order= 1
但它给出了错误“1111-无效使用组函数”,尽管没有分组依据。为什么会出现此错误?您不能在更新查询中直接使用聚合函数,并且任何在您的查询中使用聚合函数(如min)的查询都会通过添加得到一个隐式组 如果在不包含group BY的语句中使用group函数 子句,它相当于对所有行进行分组 把它简化为一个简单的例子: 更新_表集合值=最小值 将生成“错误1111 HY000:组函数的使用无效” 要实现该查询的目的,您需要这样做: 更新表格集合值=从表格中选择最小值
这意味着您的错误源是查询的这个特定部分,minp.price IFsp.reduce>0,sp.reduce,0,为了修复它,您需要将其转换为一个子查询,为您计算值。通过使用以下临时表来解决此问题:
CREATE TEMPORARY TABLE tmp SELECT id_category_default, MIN(p.price-IF(sp.reduction>0,sp.reduction, 0)) AS minprice FROM ps_product_shop p LEFT JOIN ps_specific_price sp ON p.id_product=sp.id_product AND ((sp.`from` = '0000-00-00 00:00:00' OR NOW() >= sp.`from`) AND (sp.`to` = '0000-00-00 00:00:00' OR NOW() <= sp.`to`)) AND (sp.id_shop=0 OR sp.id_shop=p.id_shop) WHERE p.available_for_order= 1 GROUP BY p.id_category_default;
UPDATE `ps_category_lang` cl LEFT JOIN ps_product_shop p ON cl.id_category=p.id_category_default AND cl.id_shop=p.id_shop AND p.available_for_order =1 AND p.visibility != 'none' LEFT JOIN ps_specific_price sp ON p.id_product=sp.id_product AND ((sp.`from` = '0000-00-00 00:00:00' OR NOW() >= sp.`from`) AND (sp.`to` = '0000-00-00 00:00:00' OR NOW() <= sp.`to`)) AND (sp.id_shop=0 OR sp.id_shop=p.id_shop) LEFT JOIN tmp t on t.id_category_default=p.id_category_default AND t.minprice is not null
SET cl.meta_title=CONCAT(SUBSTRING_INDEX(TRIM(cl.`meta_title`),'från', 1), 'från ',FORMAT(ROUND(t.minprice)*(SELECT conversion_rate FROM ps_currency WHERE iso_code='SEK' AND deleted=0),0, 'sv_SE'),' kr.',SUBSTRING_INDEX(cl.`meta_title`, ' kr.', -1))
WHERE cl.`id_lang` = 7 AND cl.meta_title LIKE '% från%' AND cl.meta_title LIKE '% kr.%' AND p.available_for_order= 1 ;
DROP TEMPORARY TABLE tmp
您的意思是我需要为值创建此字段,还是它是临时值,因为表中没有此类字段。在这里,我很难将“更新_表集合值=从_表中选择最小值”放在正确的位置。你介意把它插对吗?非常感谢。对不起,我的回答只是一个一般性的解决方案-你能解释一下为什么要使用minp.price。。。首先,我用临时表解决了这个问题。此查询的目的是更新商店类别元标题,以便访问者可以立即看到所选类别中的最低价格。非常感谢,在你为我指出之前,我不知道该去哪里看。你可以直接将子查询放到主查询中,而不是临时表中。你也可以考虑让它成为一个视图,所以它总是可用的。