【问题标题】:INSERT... SELECT... WHERE... ON DUPLICATE... mysql queryINSERT... SELECT... WHERE... ON DUPLICATE... mysql 查询
【发布时间】:2012-02-26 16:25:32
【问题描述】:

请帮忙。我正在尝试使用我们产品拥有的当前资产数量来更新这张表。如果产品已经存在于表中,它应该更新产品的最新计数。但是,使用下面的查询,mysql 正在返回我

“ERROR 1111 (HY000): 组函数使用无效”。

我无法确定我的错误是什么,或者在“重复键”函数中使用计数是否真的有效:

INSERT INTO report_count_assets
    SELECT products.product_id, 
    count(product_assets.asset_id),
    count(case when assets.asset_type_id=1 THEN 1 END), 
    count(case when assets.asset_type_id=2 THEN 1 END), 
    count(case when assets.asset_type_id=3 THEN 1 END), 
    count(case when assets.asset_type_id=11 THEN 1 END) 
    FROM products 
    LEFT JOIN product_assets USING (product_id) 
    LEFT JOIN assets USING (asset_id)
    WHERE products.brand_id=671

ON DUPLICATE KEY UPDATE
    asset_count = count(product_assets.asset_id),
    asset_type_image = count(case when assets.asset_type_id=1 THEN 1 END), 
    asset_type_video = count(case when assets.asset_type_id=2 THEN 1 END), 
    asset_type_sound = count(case when assets.asset_type_id=3 THEN 1 END), 
    asset_type_install = count(case when assets.asset_type_id=11 THEN 1 END);

【问题讨论】:

  • 这个Question可以帮助你
  • 嗨@diEcho,我并不是特别在寻找哪些产品的资产中有这些特定数字。我担心的是当产品已经存在于表中时查询的更新部分。我不知道如何在 'ON DUPLICATE KEY UPDATE' 上实现 select-join 查询

标签: mysql mysql-error-1111


【解决方案1】:

我认为您不能在 ON DUPLICATE 中使用聚合函数。 MySQL 看到你的 SQL 是这样的:

insert into report_count_assets
expr
on duplicate key update
...

ON DUPLICATE 不知道expr 中发生了什么,它只知道它有一个重复的行要处理。在不知道expr 内部发生了什么的情况下,counts 没有可以操作的上下文。此外,您应该在更新中使用values

您可以在UPDATE 子句中使用VALUES(col_name) 函数来引用INSERT ... ON DUPLICATE KEY UPDATE 语句的INSERT 部分中的列值。

并且values(count(x)) 不是有效的语法。但是values(column_name) 是有效的,所以这应该可以工作:

INSERT INTO report_count_assets
(product_id, asset_count, asset_type_image, asset_type_video, asset_type_sound, asset_type_install)
    SELECT products.product_id, 
    count(product_assets.asset_id),
    count(case when assets.asset_type_id=1 THEN 1 END), 
    count(case when assets.asset_type_id=2 THEN 1 END), 
    count(case when assets.asset_type_id=3 THEN 1 END), 
    count(case when assets.asset_type_id=11 THEN 1 END) 
    FROM products 
    LEFT JOIN product_assets USING (product_id) 
    LEFT JOIN assets USING (asset_id)
    WHERE products.brand_id=671
ON DUPLICATE KEY UPDATE
    asset_count = values(asset_count),
    asset_type_image = values(asset_type_image), 
    asset_type_video = values(asset_type_video), 
    asset_type_sound = values(asset_type_sound), 
    asset_type_install = values(asset_type_install);

我不得不猜测report_count_assetsproduct_id 列的名称。

如果这不起作用(显然它不起作用),那么您可以通过预先计算 SELECT 来实现这一点。创建临时表:

create temporary table t (
    product_id int,
    product_count int,
    assets1 int,
    assets2 int,
    assets3 int,
    assets11 int
)

填充它:

INSERT INTO t (product_id, product_count, assets1, assets2, assets3, assets11)
SELECT products.product_id, 
count(product_assets.asset_id),
count(case when assets.asset_type_id=1 THEN 1 END), 
count(case when assets.asset_type_id=2 THEN 1 END), 
count(case when assets.asset_type_id=3 THEN 1 END), 
count(case when assets.asset_type_id=11 THEN 1 END) 
FROM products 
LEFT JOIN product_assets USING (product_id) 
LEFT JOIN assets USING (asset_id)
WHERE products.brand_id=671

然后使用那个临时表来做你真正想做的插入:

insert into report_count_assets
    select product_id, product_count, assets1, assets2, assets3, assets11
    from t
on duplicate key update
    asset_count = values(product_count),
    asset_type_image = values(assets1),
    asset_type_video = values(assets2),
    asset_type_sound = values(assets3),
    asset_type_install = values(assets11)

【讨论】:

  • 嗨@mu 太短了,非常感谢!你救了我很多血。
  • @Jan-DeanFajardo:如果你有兴趣,我今天早上有更好的解决方案。
  • @Jan-DeanFajardo:您只需在我的更新中的ON DUPLICATE 部分中使用values。我不知道我对那些临时表的东西在想什么,@ 987654322@ 也许。我责怪睡前回答:)
  • 其实你对临时表所做的事情解决了我的问题。 ON DUPLICATE 中的 values() 不起作用,因为它只获取字段的当前值,而不是我从 SELECT 子句获取的更新值。
  • @Jan-DeanFajardo:我把临时表方法放回去了,有什么用 :)
【解决方案2】:

尝试按 product_assets.asset_id 分组:

.
.
WHERE products.brand_id=671
group by product_assets.asset_id
ON DUPLICATE KEY UPDATE
    asset_count = count(product_assets.asset_id)
.
.

【讨论】:

猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
相关资源
最近更新 更多