1

products と products_temp というまったく同じテーブルが 2 つあります。2 つのテーブルを比較したいのですが、現在、以下のクエリを使用しています。各テーブルに多くの製品がない場合は問題なく動作しますが、現在、それぞれに約 10,000 があり、実行に時間がかかり、エラーで終了します ' mysql サーバーはなくなりました。

以下のクエリを見て、それを最適化する方法をアドバイスしてください

SELECT MIN( id ) AS id , product_id, product_name, program_id, program_name, deeplink,   price, image_url, merchant_category, category_id, category_path, brand, last_updated, tab
            FROM (
                SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Temp' AS                   tab
                FROM products_temp AS alias1
            UNION ALL 
                SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Current'                   AS tab
                FROM products AS alias2
            )AS alias_table
            GROUP BY id
            HAVING COUNT( id ) =1 #
4

1 に答える 1

0

クエリは、「一時」テーブルまたは「ライブ」テーブルのいずれかから、常にすべての ID を返すため、すべての行が返されるようです。あなたが実際に探しているのは...「一時」テーブルのすべてのレコードから、「ライブ」テーブルに既に存在するか、それとも新しく更新/更新する必要があるかです。この答えを得るには、次のような左結合を行います

SELECT tmp.*, if( products.id IS NULL, 1, 0 ) as NotOnLiveFile from products_temp tmp left tmp.ID = products.id で製品に参加

グループ化する必要も、HAVING 句も必要ありません。製品が既に ON ファイルになっている場合、それをどうしたいですか... Temp からの値でライブ値を更新しますか? レコードが「NotOnLiveFile」の場合、それらを追加しますか? このアプローチでは、1 つの結果セットに必要なものがすべて含まれています。

これがあなたの意図である場合は、相関更新 (既存のエントリの場合) または挿入 (ライブ ファイルがまだない場合) をいつでも実行できます。

于 2012-05-29T13:34:40.223 に答える