2014-11-28 16 views
2

UPSERT를 수행하는 쿼리가 있습니다 (삽입 - 있지만 존재하는 경우 업데이트).MySQL 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 

나는이 당신에 의미가 있기를 바랍니다. 문제는 ) newsum 인 줄에 있습니다. MySql은 테이블에 부여 할 별칭에 대해 불평합니다. user_id는이 테이블에서 고유합니다 (mytable).

B.total이 null 일 수 있습니다.이 경우 newsum의 모든 항목이 null입니다. 그러면 아무 것도 삽입하거나 업데이트하지 않습니다. (또는 모든 항목에 대해 user_id 및 0으로 업데이트 할 수 있습니다. 미세 너무).

내가 잘못하고있는 것에 대한 의견이 있으십니까? 감사합니다

+0

매뉴얼에 대해 아무것도 없습니다 선택 항목의 별명을 지정할 수 있습니다 (선택 항목은 대괄호 안에 있으면 안됩니다). INSERT SELECT 테이블을 참조하는 것과는 반대로 "중복 된 키를 사용하여" "A"및 "B"테이블을 다시 참조 할 수 있습니까? – Robbie

+0

참고로, 해당하는 경우 별칭 이름에 '따옴표'대신 '역 따옴표'를 사용해야합니다. 이름에 따옴표가 필요하지 않으므로 (특수 문자가 없기 때문에) 백틱을 지원하지 않는 다른 서버와의 쿼리 호환성을 보장하기 위해 이름을 사용하지 마십시오. 참조 : https://dev.mysql.com/doc/refman/5.0/en/identifiers.html – Lance

답변

0

VALUES 문을 사용하려고합니까?

중복 KEY UPDATE 문 ON ... 삽입물의 INSERT 부분에서 컬럼 값을 참조하는 UPDATE 절에서 VALUES (컬럼 이름) 함수를 사용할 수는

dev.mysql

관련 문제