组函数使用无效但没有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

manual ref

并将其简化为简单的示例:

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