sql >> データベース >  >> RDS >> Mysql

INSERT ... SELECT ... WHERE ... ON DUPLICATE...mysqlクエリ

    ON DUPLICATE 。 MySQLはSQLを次のように認識します:

    insert into report_count_assets
    expr
    on duplicate key update
    ...
    

    ON DUPLICATEは、exprで何が起こっているのかを知りません 、処理する重複行が1つしかないことだけを認識しています。 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. MariaDBLIMITステートメントは制限以上のものをもたらします

    2. アパートの宝石に関する外部キーの問題

    3. 私の単純なMySqlクエリはインデックスを使用しません

    4. phpとmysqlで複数のキーワードを検索します(Xが好きな場合)