2012-02-04 3 views
0

도와주세요. 우리 제품에있는 자산의 현재 개수로이 테이블을 업데이트하려고합니다. 제품이 이미 표에 존재하는 경우 제품의 최신 업데이트 수가 업데이트되어야합니다. 그러나 아래 쿼리를 사용하면 mysql이 나를 반환합니다.INSERT ... SELECT ... WHERE ... ON DUPLICATE ... mysql query

"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); 
+0

thi [질문] (http://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function) 도움이 될 수도 있습니다 – diEcho

+0

안녕하세요 @ diEcho, 난 특별히이 특정 번호가 어떤 제품을 찾고 아니에요 그들의 자산에서. 내 관심사는 제품이 이미 테이블에있을 때 쿼리의 업데이트 부분입니다. 어떻게 선택 조인 쿼리가 '중복 키 업데이트'에 구현 될 수 있는지 모르겠습니다. –

답변

4

난 당신이 집계 함수를 사용할 수 있다고 생각하지 않습니다 ON DUPLICATE. MySQL은 같은 종류의 당신의 SQL을보고 :

insert into report_count_assets 
expr 
on duplicate key update 
... 

온 중복 expr에서 무슨 일이 일어나고 있는지 모르고, 그것은 단지 그것을 다루는 하나의 중복 행이 있음을 알고있다. expr 내부에서 일어나는 일을 알지 못하면 count이 작동하기위한 컨텍스트가 없습니다. 또한, 당신은 UPDATE에 values를 사용하는 거 야 : 당신은 INSERT ... ON DUPLICATE KEY UPDATE 문의 INSERT 부분에서 열 값을 참조 할 수 UPDATE 절에 VALUES(col_name) 기능을 사용할 수 있습니다

.

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를 미리 계산하여 어렵게 수행 할 수 있습니다. 임시 테이블을 만듭니다

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 

을 그리고 임시 테이블은 당신이 정말로 원하는 삽입 할 것을 사용합니다 :

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

는 채우기

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) 
+0

안녕 @ 뮤가 너무 짧습니다, 정말 고마워요! 네가 나 한테 피를 ​​많이 흘 렸어. –

+0

@ Jan-DeanFajardo : 관심이 있다면 오늘 아침에 훨씬 좋은 해결책이 있습니다. –

+0

네, 제발 알고 싶습니다. –

0

에 의해 그룹에 시도를 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) 
. 
. 
+0

또한이 [link] (http://stackoverflow.com/questions/1712240/mysql-insert-into-on-duplicate-key)를 참조하십시오. -with-select-statement-issue) –