मुझे नहीं लगता कि आप ON DUPLICATE
. MySQL आपके SQL को इस तरह देखता है:
insert into report_count_assets
expr
on duplicate key update
...
ON DUPLICATE को नहीं पता कि expr
में क्या हो रहा है , यह केवल यह जानता है कि इससे निपटने के लिए एक एकल डुप्लिकेट पंक्ति है। बिना जाने क्या चल रहा है expr
. के अंदर , count
. के लिए कोई संदर्भ नहीं है s संचालित करने के लिए। साथ ही, आपको values
. का उपयोग करना चाहिए अद्यतन में:
और 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);
मुझे product_id
के नाम का अनुमान लगाना था report_count_assets
में कॉलम ।
यदि यह काम नहीं करता है (जैसा कि जाहिरा तौर पर यह नहीं करता है), तो आप इसे 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)