MySQL UPSERT无法识别别名

MySQL UPSERT无法识别别名,mysql,left-join,upsert,Mysql,Left Join,Upsert,我有一个执行UPSERT插入的查询,但如果存在,则更新 MySQL抱怨它无效,以下是查询: insert into mytable (user_id, num_products_observed, num_purchased_percent) (select A.user_id, B.total 'num_products_observed', case when A.purchased is null t

我有一个执行UPSERT插入的查询,但如果存在,则更新

MySQL抱怨它无效,以下是查询:

insert into
    mytable (user_id, num_products_observed, num_purchased_percent)
    (select
        A.user_id,
        B.total 'num_products_observed',
        case 
            when A.purchased is null then 0
            else A.purchased/B.total
        end 'num_purchased_percent'
     from
         (select user_id, count(prod_observed) 'total' from products where user_id = ? ) B
         left join (select user_id, count(prod_purch) 'purchased' from products_purchased) A on B.user_id = A.user_id
    ) newsum -- <--- ISSUE IS HERE
ON DUPLICATE KEY UPDATE
    num_products_observed = newsum.num_products_observed,
    num_purchased_percent = newsum.num_purchased_percent
我希望这对你有意义。问题出在新闻专栏上。MySql抱怨我给表的别名。用户id在此表mytable中是唯一的

有可能B.total是空的,在这种情况下,newsum中的所有内容都是空的-这很好,那么我不想插入或更新任何内容,或者使用user_id和零表示所有内容的更新也很好


有没有想过我做错了什么?感谢您尝试使用VALUES语句

您可以使用UPDATE子句中的VALUEScol\U name函数引用INSERT中INSERT部分的列值。。。关于重复密钥更新语句


手册中没有关于能够为select别名的内容,select不应该在括号中。您不能在ON DUPLICATE键中再次引用A和B表,而不是引用INSERT SELECT表吗?仅供参考,您的别名应该使用反勾号而不是引号(如果适用)。由于您的名字不需要引号,因为它们没有特殊字符,所以根本不要使用它们,以确保您的查询与其他不支持反勾号的服务器的兼容性。见: