0

次のクエリでは、テーブルからすべての ID を選択して比較し、一部の ID を「バックブレイズ セールス オーダー」としてフィルター処理します。レポートをチェックするたびに、時間が 10 秒ずつ長くなることに気付きました。そのテーブルを変数に選択して、テーブルが何度もクエリされないように、より効率的に比較できるようにするにはどうすればよいですか?

これまでのところ、ポールの回答の temp_table を使用しましたが、「テンプテーブルを再開できません」というエラーが表示されます。

CREATE TEMPORARY TABLE if not exists TempTable (id varchar(36)); 
INSERT INTO TempTable (id)
SELECT
   id
FROM 
   reporting.backblaze_sales_orders;
SELECT
  2011 as year,
  so.technical_address_country,
  so.technical_address_state,
  /* ALL JOBs */
  COUNT(so.id) as all_sales,
  COUNT(mf.id) as all_jobs,
  SUM(so.total_value) as all_value,
    SUM(IF(so.check_if_new_customer=1,1,0)) as sales_order_new,
  SUM(IF(so.check_if_new_customer = 1,so.total_value,0)) as total_value_new,
    SUM(IF(so.check_if_new_customer=1 AND mf.id IS NOT NULL,1,0)) as jobs_new,
    SUM(IF(so.check_if_new_customer=0,1,0)) as sales_order_existing,
  SUM(IF(so.check_if_new_customer = 0,so.total_value,0)) as total_value_existing,
    SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL,1,0)) as jobs_existing,
      /* ALL JOBs */
  COUNT(so.id) as all_sales_back_blaze,
  COUNT(mf.id) as all_jobs_back_blaze,
  SUM(so.total_value) as all_value,
    SUM(IF(so.check_if_new_customer=1 AND so.id not in (SELECT id from TempTable) ,1,0)) as sales_order_new_back_blaze,
  SUM(IF(so.check_if_new_customer = 1 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_new_back_blaze,
    SUM(IF(so.check_if_new_customer=1 AND  mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_new_back_blaze,
    SUM(IF(so.check_if_new_customer=0 AND so.id not in (SELECT id from TempTable),1,0)) as sales_order_existing_back_blaze,
  SUM(IF(so.check_if_new_customer = 0 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_existing_back_blaze,
    SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_existing_back_blaze
FROM 
  sugarcrm2.so_order so 
LEFT JOIN 
  sugarcrm2.mf_job mf on so.id = mf.sales_order_id 
WHERE 
  so.date_entered > "2010-10-30" AND so.date_entered >"2011-10-30" AND
    so.technical_address_country IS NOT NULL AND  
  so.technical_address_state IS NOT NULL AND 
  so.deleted = 0 AND 
  so.has_been_promoted = 1 
GROUP BY 
    YEAR(so.date_entered),
  so.technical_address_country, 
  so.technical_address_state
ORDER BY 
  so.technical_address_country, so.technical_address_state 
4

3 に答える 3

2

すべてのコードを読んだわけではありませんが、一時テーブルが必要なようです。これらは次のように使用できます。

CREATE TEMPORARY TABLE TempTable (id int, otherValue varchar(100)); 

INSERT INTO TempTable (id, otherValue)
SELECT
   id,
   someOtherValue
FROM ....

次に、クエリの代わりにこのテーブルを使用します。

于 2012-11-09T15:24:47.637 に答える
1

カーソルを使用します: http ://www.brainbell.com/tutorials/MySQL/Working_With_Cursors.htm

DECLARE ordernumbers CURSOR
   FOR
   SELECT ordernum FROM orders;

これは単なるヒントです!誰かがそれを使って完全な答えを出してくれることを願っています。

于 2012-11-09T15:26:45.623 に答える
0

答えは、単にそのテーブルに結合し、結合されたテーブルの ID が null かどうかをテストすることです。

于 2012-11-09T19:20:49.353 に答える