组函数使用无效但没有GROUP BY
Invalid use of group function but there is no 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
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 - 组函数的无效使用”,尽管没有分组依据。为什么会出现此错误?
您不能在 UPDATE
查询中直接使用聚合函数 - 任何使用聚合函数的查询(例如您的 min
)都会得到隐式的 group by
已添加。
If you use a group function in a statement containing no GROUP BY
clause, it is equivalent to grouping on all rows
并将其简化为简单的示例:
update the_table set value = min(value)
将生成您的`ERROR 1111 (HY000): 组函数使用无效。
要实现该查询的目的,您需要这样做:
update the_table set value = (select min(value) from the_table)
这意味着您的错误来源是查询的这个特定部分,min(p.price-IF(sp.reduction>0,sp.reduction, 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
我正在尝试 运行 这个查询:
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 - 组函数的无效使用”,尽管没有分组依据。为什么会出现此错误?
您不能在 UPDATE
查询中直接使用聚合函数 - 任何使用聚合函数的查询(例如您的 min
)都会得到隐式的 group by
已添加。
If you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows
并将其简化为简单的示例:
update the_table set value = min(value)
将生成您的`ERROR 1111 (HY000): 组函数使用无效。
要实现该查询的目的,您需要这样做:
update the_table set value = (select min(value) from the_table)
这意味着您的错误来源是查询的这个特定部分,min(p.price-IF(sp.reduction>0,sp.reduction, 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