Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

सम्मिलित करें... चुनें... कहां... डुप्लीकेट पर... mysql क्वेरी

मुझे नहीं लगता कि आप 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस से पढ़े गए विकल्प मेनू का चयन करें और इसके मूल्यों का उपयोग करें

  2. नोड-mysql परिणाम पंक्तियों को नोड.जेएस के लिए एकल JSON रिटर्न में जोड़ना

  3. MySQL:पिवट + काउंटिंग

  4. MySQL डेटाबेस में AES एन्क्रिप्टेड जानकारी को कैसे स्टोर करें

  5. जांचें कि PHP पीडीओ का उपयोग कर उपयोगकर्ता नाम मौजूद है या नहीं