Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MASUKKAN... PILIH... DI MANA... DI DUPLICATE... permintaan mysql

Saya tidak berpikir Anda dapat menggunakan fungsi agregat di ON DUPLICATE . MySQL melihat SQL Anda seperti ini:

insert into report_count_assets
expr
on duplicate key update
...

ON DUPLICATE tidak tahu apa yang terjadi di expr , ia hanya tahu bahwa ia memiliki satu baris duplikat untuk ditangani. Tanpa mengetahui apa yang terjadi di dalam expr , tidak ada konteks untuk count s untuk beroperasi. Juga, Anda seharusnya menggunakan values dalam PEMBARUAN:

Dan values(count(x)) bukan sintaks yang valid. Tapi values(column_name) valid jadi ini akan berfungsi:

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);

Saya harus menebak nama product_id kolom di report_count_assets .

Jika itu tidak berhasil (sepertinya tidak), maka Anda dapat melakukannya dengan cara yang sulit dengan melakukan pra-komputasi SELECT. Buat tabel sementara:

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

Isi:

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

Dan kemudian gunakan tabel sementara itu untuk melakukan penyisipan yang benar-benar ingin Anda lakukan:

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. Bagaimana cara mengisyaratkan indeks untuk digunakan dalam kueri pemilihan MySQL?

  2. Bagaimana cara membuat MySQL menangani string seperti yang dilakukan SQLite, sehubungan dengan Unicode dan collation?

  3. Menggunakan MySql, dapatkah saya mengurutkan kolom tetapi 0 datang terakhir?

  4. Polling JQuery menggunakan MySQL dan PHP. Bagaimana?

  5. MySQL SHA() tidak berfungsi