mysql - 如何将查询存储到变量中以便我可以使用它两次?

标签 mysql variables optimization select

我有以下查询,我从表中选择所有 ID 进行比较,以过滤一些 ID 作为“backblaze 销售订单”。我注意到每次检查报告后,它都会增加 10 秒的时间。我如何才能将该表选择到一个变量中,以便我可以比较事物以提高效率,从而不会一遍又一遍地查询该表?

到目前为止,我已经使用了 paul 的答案中的 temp_table,但它给我一个错误,提示“无法重新打开 temptable”。

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 

最佳答案

没有通读你所有的代码,但听起来你需要一个临时表。这些可以像这样使用:

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

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

然后使用此表代替您的查询。

关于mysql - 如何将查询存储到变量中以便我可以使用它两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310798/

相关文章:

php - 注册流程+php mysql

mysql - 如何将集合/枚举中的值转换为整数mysql

variables - 非法变量名称的 Csh 问题

java - 实例变量的多态性

php - PDO查询错误: 2013 Lost connection to MySQL server during query [Need Optimization Help]

mysql - 如何使用sql根据另一个查询的结果选择元素

mysql - 如何将控制流添加到 mysql 函数中?

file - 使用 GoLang 从文件中读取字符串、整数和 double

python - Google Cloud 数据存储延迟

r - 解决R中具有复杂约束的二次优化问题